EF Code First复合键映射

时间:2011-01-20 11:31:39

标签: entity-framework-4 mapping fluent

我正在使用EF 4的CTP 5和Code。 我不会在一方面使用复合键来处理很多关系。

    modelBuilder.Entity<Item>()                 
           .HasMany(i => i.Categories)  
           .WithMany(o => o.Items)  
           .Map(
           mc =>
           {                  
               mc.ToTable("ItemCategories");  
               mc.MapLeftKey(i => i.Id, "ItemId");  
               mc.MapRightKey(o => o.TemplateID, "TemplateId");  
               mc.MapRightKey(o => o.ItemId, "ItemId");                  
           }
           );

因此,我没有在匹配表中使用类别的简单键,而是使用了复合键。复合键的一部分也是Item类型的关键, 这似乎是问题所在。

我收到错误:“类型中的每个属性名称必须是唯一的。属性名称'ItemId'已经定义。”

在这种情况下,如何配置EF以使用复合键?

2 个答案:

答案 0 :(得分:2)

当然,在一个表中不能有2个具有相同名称的列。这将有效:

modelBuilder.Entity<Item>()
            .HasMany(i => i.Categories)
            .WithMany(c => c.Items)
            .Map(m =>
            {
                m.MapRightKey(i => i.Id, "ItemId");
                m.MapLeftKey(c => c.ItemId, "ItemId2");
                m.MapLeftKey(c => c.TemplateId, "TemplateId");
            });

答案 1 :(得分:0)

public class Category
{            
    [Key]        
    public string ItemId { get; set; }
    [Key]
    public string TemplateId { get; set; }

    public string Value { get; set; }

    public ICollection<Item> Items { get; set; }
}

public class Item
{       
    public string Id { get; set; }       
    public string Name { get; set; }      

    public ICollection<Category> Categories { get; set; }
}

映射表ItemCategories不是POCO,而是用于将这两个映射为 所示。 它有SQL列 Id(自己的主键) ItemId(FK到Item表和Category表) TemplateId(FK到类别表)

和另一个映射到不同表的ID列。

在我看来,这里与“正常”许多场景的唯一区别是复合键 在ItemCategories表中,它构建了与Category表的关系。