我正在使用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以使用复合键?
答案 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表的关系。