使用Entity Framework 4.1 Code First Fluent API配置具有基于其他两个实体的复合键的实体

1 mapping entity entity-framework-4.1

我刚刚开始掌握实体框架,并且对简单实体到各个表的映射没有任何问题,但现在我遇到了一个让我难过的更高级的场景.

我有以下POCO

public class Group  
{  
    public int GroupId  {get; set;}  
    public string GroupName {get; set;}
    public virtual ICollection<EventTypePreference> Preferences {get; set;}
}

public class EventType
{
    public int EventTypeId {get; set;}
    public string EventTypeName {get; set;}
    public string EventColor {get; set;}
}

public class EventTypePreference
{
    public int GroupId {get; set;}
    public int EventTypeId {get; set;}

    public virtual Group Group {get; set;}
    public virtual EventType EventType {get; set;}
    public int EventLength {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中,Group将有许多EventTypePreferences(每个EventType有一个首选项记录).EventTypePreferences是数据库中的一个表,其匹配列与其对应的POCO相同.此外,在数据库中,EventTypePreference表使用基于GroupId和EventTypeId的复合主键.

所以说Group表有以下行(GroupId,GroupName)......

1, Human Resources
2, Purchasing
3, Information Services  
Run Code Online (Sandbox Code Playgroud)

并且EventType表具有以下行(EventTypeId,EventTypeName,EventColor)...

1, Training Event, Blue
2, Sales Seminar, Red
3, Office Party, Yellow
Run Code Online (Sandbox Code Playgroud)

EventTypePreferences的值为(EventTypeId,GroupId,EventLength)...

1, 1, 60
1, 2, 45
1, 3, 60
2, 1, 120
.........
Run Code Online (Sandbox Code Playgroud)

我的问题是我正在努力弄清楚如何流畅地配置这些关系,特别是对于我的EventTypePreference实体.我看到它,因为这个实体中有很多Group和EventTypes.有人可以帮我解决这个问题吗?

Lad*_*nka 8

试试这个:

modelBuilder.Entity<EventTypePreference>()
            .HasKey(p => new { p.EventTypeId, p.GroupId });

modelBuilder.Entity<EventTypePreference>()
            .HasRequired(p => p.EventType)
            .WithMany()
            .HasForeignKey(p => p.EventTypeId);

modelBuilder.Entity<EventTypePreference>()
            .HasRequired(p => p.Group)
            .WithMany(g => g.Preferences)
            .HasForeignKey(p => p.GroupId);
Run Code Online (Sandbox Code Playgroud)