многие ко многим, poco, ef4 - PullRequest
       39

многие ко многим, poco, ef4

0 голосов
/ 21 декабря 2010

У меня есть 3 объекта:

Goods [GID(PK), GoodName]
Persons [PID(PK), PersonName]
Roles [RID(PK), RoleName]

Но теперь мне нужно связать эти объекты друг с другом. Другими словами, каждый товар может иметь МНОЖЕСТВО людей в МНОГИХ ролях. У меня есть таблица в БД с 3 полями (GID, PID, RID)

Например:

Book (GID#1), can have 3 associated persons:

1. Jack (PID#1) in role Author (RID#1)
2. Jack (PID#1) in role Editor (RID#2)
3. Bill (PID#2) in role Painter (RID#3)

Как мне отобразить это в формате POCO в Entity Framework 4?

1 Ответ

0 голосов
/ 21 декабря 2010

Полагаю, вам нужно создать еще один заголовок PersonRoles, в котором вы сохраняете отношение Person-Role, а затем вы получаете доступ к роли person + через этот файл:

PersonRoles [PRID(PK), PersonName, RoleName] (примечание: вы также можете сделать это без ключа сущности, только отношения, EF устранит эту сущность и предоставит прямую сущность Person.Roles, к которой вы можете получить доступ через Book.Persons.Select((p) p.Roles)).

PersonRole#1: Jack#1/Author#1
PersonRole#2: Jack#1/Editor#2
PersonRole#3: Bill#2/Painter#3

Book.PersonRole = context.PersonRoles.
  SingleOrDefault((pr) => pr.Person.PersonId == 1 && pr.RoleId == 1);

Примечание: мой основной язык - VB.NET, поэтому я прошу прощения за приведенный выше псевдокод, но я надеюсь, что вы поняли.

Обновление

Это должно быть как:

<DataContract(IsReference:=True)>
<KnownType(GetType(Good))>
<KnownType(GetType(Person))>
<KnownType(GetType(Role))>
Partial Public Class GoodPersonRole
    Implements IObjectWithChangeTracker
    Implements INotifyPropertyChanged

<DataMember()>
Public Property GoodId() As Integer
    Get
        Return _goodId
    End Get
    Set(ByVal value As Integer)
        If Not Equals(_goodId, value) Then
            If ChangeTracker.ChangeTrackingEnabled AndAlso ChangeTracker.State <> ObjectState.Added Then
                Throw New InvalidOperationException("The property 'GoodId' is part of the object's key and cannot be changed. Changes to key properties can only be made when the object is not being tracked or is in the Added state.")
            End If
            If Not IsDeserializing Then
                If Good IsNot Nothing AndAlso Not Equals(Good.GoodId, value) Then
                    Good = Nothing
                End If
            End If
            _goodId = value
            OnPropertyChanged("GoodId")
        End If
    End Set
End Property

Private _goodId As Integer


<DataMember()>
Public Property Good() As Good
    Get
        Return _good
    End Get
    Set(ByVal value As Good)
        If _good IsNot value Then
            If ChangeTracker.ChangeTrackingEnabled AndAlso ChangeTracker.State <> ObjectState.Added AndAlso value IsNot Nothing Then
                ' This the dependent end of an identifying relationship, so the principal end cannot be changed if it is already set,
                ' otherwise it can only be set to an entity with a primary key that is the same value as the dependent's foreign key.
                If Not Equals(GoodId, value.GoodId) Then
                    Throw New InvalidOperationException("The principal end of an identifying relationship can only be changed when the dependent end is in the Added state.")
                End If
            End If
            Dim previousValue As Good = _good
            _good = value
            FixupGood(previousValue)
            OnNavigationPropertyChanged("Good")
        End If
    End Set
End Property
Private _good As Good
End Class

(часть из сгенерированной сущности с помощью ADO.NET VB POCO Generator Entity )

Я только что скопировал «Good» Id и nav. собственности, но их должно быть трое.

...