MVC脚手架和EF'一对一或零'关系错误

NVM*_*NVM 9 .net c# entity-framework asp.net-mvc-3 asp.net-mvc-scaffolding

在我的AspNet MVC 3项目中,当我尝试将一个与另一个实体具有一对一或一个关系的实体搭建时,我得到"已经添加了具有相同索引的项目"错误.

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

目前我的解决方法是

  1. 将Id列添加到相关表中并使其成为主键

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

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

这是一个知道错误吗?

难道我做错了什么?

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

WDR*_*ust 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用 DataAnnotations 来实现此目的,但我通常更喜欢将实体模型保留为POCO