在我的AspNet MVC 3项目中,当我尝试搭建一个与另一个实体具有一对一或一个关系的实体时,我得到“已经添加了具有相同索引的项目”错误
基本上,当相关表的主键也是外键时会发生这种情况。
目前我的解决方法是
将Id列添加到相关表中,并将其设为主键
将唯一键添加到外键列。
这个问题是EF会为相关实体生成ICollection导航属性,而不仅仅是相关实体类型的属性(如果零相关实体,我可以设置为null)
这是一个知道错误吗?
我做错了吗?
是否有更好的解决方法来摆脱ICollection导航属性?
答案 0 :(得分:3)
请参阅我对这个问题的回答:
这是具有正确配置的示例代码。
public class ZoneMedia
{
public int ZoneMediaID { get; set; }
public string MediaName { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public virtual ZoneMediaText MediaText { get; set; }
}
public class ZoneMediaText
{
public int ZoneMediaID { get; set; }
public string Text { get; set; }
public int Color { get; set; }
public virtual ZoneMedia ZoneMedia { get; set; }
}
public class TestEFDbContext : DbContext
{
public DbSet<ZoneMedia> ZoneMedia { get; set; }
public DbSet<ZoneMediaText> ZoneMediaText { get; set; }
protected override void OnModelCreating (DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ZoneMedia>()
.HasOptional(zm => zm.MediaText);
modelBuilder.Entity<ZoneMediaText>()
.HasKey(zmt => zmt.ZoneMediaID);
modelBuilder.Entity<ZoneMediaText>()
.HasRequired(zmt => zmt.ZoneMedia)
.WithRequiredDependent(zm => zm.MediaText);
base.OnModelCreating(modelBuilder);
}
}
class Program
{
static void Main (string[] args)
{
var dbcontext = new TestEFDbContext();
var medias = dbcontext.ZoneMedia.ToList();
}
}
您也可以使用DataAnnotations实现此目的,但我通常更喜欢将实体模型保留为POCOs。
答案 1 :(得分:1)
尝试将[Key]
属性用于预期的主键。您可能需要导入名称空间System.ComponentModel.DataAnnotations
另请查看有关此命名空间的完整实现的文档。
http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx