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

时间:2011-08-04 20:04:21

标签: 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;}
}

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

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

1, Human Resources
2, Purchasing
3, Information Services  

EventType表包含以下行(EventTypeId,EventTypeName,EventColor)......

1, Training Event, Blue
2, Sales Seminar, Red
3, Office Party, Yellow

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

1, 1, 60
1, 2, 45
1, 3, 60
2, 1, 120
.........

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

1 个答案:

答案 0 :(得分: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);