9

在我的 AspNet MVC 3 项目中,当我尝试构建与另一个实体具有一对零或一关系的实体时,我收到“已添加具有相同索引的项目”错误。

本质上,当相关表的主键也是外键时,就会发生这种情况。

目前我的解决方法是

  1. 在相关表中添加一个Id列,并使其成为主键

  2. 将唯一键添加到外键列。

这样做的问题是 EF 将为相关实体生成一个 ICollection 导航属性,而不仅仅是相关实体类型的属性(如果相关实体为零,我可以将其设置为 null)

这是一个已知的错误吗?

难道我做错了什么?

是否有更好的解决方法来摆脱 ICollection 导航属性?

4

2 回答 2

3

请参阅我对这个问题的回答:

如何首先使用延迟加载和两个表上的相同主键在 EF 4.1 代码中编写可选的一对一关系?

这是具有正确配置的示例代码。

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 来实现这一点,但我通常更喜欢将我的实体模型保留为POCO

于 2012-02-25T08:22:35.473 回答
1

尝试将[Key]属性用于预期的主键。您可能需要导入命名空间System.ComponentModel.DataAnnotations

另请查看有关此命名空间的完整实现的文档。

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

于 2012-02-24T17:53:34.080 回答