2010-12-21 91 views
0

我有3个实体:多到很多,POCO,EF4

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

但现在我需要将这些对象相互关联。 换句话说,每个好人可以有许多人拥有许多角色。 我在DB 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) 

我怎样才能在实体框架4 POCO格式地图呢?

回答

0

我相信你已经创建另一个PersonRoles头球您存储的人,角色关系,那么你通过这一次访问的人+角色:

PersonRoles [PRID(PK), PersonName, RoleName](注:你也可以做到这一点withnow的EntityKey,只是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); 

注:我的主要lang是VB.NET,所以我对上面的pseudu代码道歉,但我希望你的想法。

更新

应该是这样:

<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 Entity Generator部分从生成的实体)

我刚才复制的 '好' Id和导航。财产,但它应该是其中的三个。

+0

感谢您的快速回答,但我已经在DB有3个字段(GID,PID,RID)的表。问题是,如何将此表映射到EF4中的对象? – Lari13 2010-12-21 14:04:16