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

时间:2012-02-15 10:21:10

标签: c# .net asp.net-mvc-3 entity-framework asp.net-mvc-scaffolding

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

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

目前我的解决方法是

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

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

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

    这是一个知道错误吗?

    我做错了吗?

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

2 个答案:

答案 0 :(得分:3)

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

How do I code an optional one-to-one relationship in EF 4.1 code first with lazy loading and the same primary key on both tables?

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

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