Definindo chaves estrangeiras no Linq para SQL

É sabido que você não pode definir IDs de chave estrangeira diretamente no Linq como SQL se as entidades já tiverem sido carregadas. No entanto, você pode procurar a entidade por sua chave estrangeira e depois defini-la como entidade estrangeira usando o relacionamento da entidade. (Retirei o enum aqui e usei valores inteiros por simplicidade). ou seja, se eu tenho uma entidade Nomeação carregada e uma Entidade AppoinmentStatus associada, não posso fazer isso: -

ExistingAppointment.AppointmentStatusID = 7

Mas eu posso fazer isso: -

ExistingAppointment.AppointmentStatus = (From appstat In db.AppointmentStatus _
                                        Where appstat.StatusID = 7 _
                                        Select appstat).Single

Eu tenho esse tipo de coisa espalhando meu código e gostaria de refatorar. Assim...

Obviamente, eu poderia usar um método auxiliar em um módulo como este: -


Module Helper
    Public Shared Function GetAppointmentStatus(ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatus _
                                       Select appstat).Single
    End Function
End Module

Eu poderia até transformar isso em um método de extensão, assim.


Imports System.Runtime.CompilerServices
Module Helper
Extension()> _
    Public Shared Function GetAppointmentStatus(ByVal db as DataClassesDataContext, ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Module

Eu também poderia colocar isso na classe parcial Linq to SQL, assim.


Partial Public Class DataClassesDataContext    
    Public Function GetAppointmentStatus(ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In Me.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Class

Além disso, eu poderia colocar o código na classe parcial Linq to SQL Appointment Entity da seguinte maneira: -


Partial Public Class Appointment    
    Public Function GetAppointmentStatus(ByVal db as DataClassesDataContext, ByVal AppStatusID As Integer) As AppointmentStatus
            GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Class

O que devo fazer e por quê, ou existe uma alternativa melhor?

questionAnswers(3)

yourAnswerToTheQuestion