Entity framework EF6代码优先-多个一对多和同一实体

Entity framework EF6代码优先-多个一对多和同一实体,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我有一个实体模型,其中包含对另一个实体的多个定义。我可以用一个定义,但不能两者都用 public class Inspection : Entity<int> { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int InspectionId { get; set; } [ForeignKey("Report")] public int

我有一个实体模型,其中包含对另一个实体的多个定义。我可以用一个定义,但不能两者都用

public class Inspection : Entity<int>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int InspectionId { get; set; }

    [ForeignKey("Report")]
    public int ReportId { get; set; }

    public virtual Report Report { get; set; }

    ....

    public virtual ICollection<ResidentialDescriptionItem> ResidentialDescriptionItems { get; set; }
    public virtual ICollection<ResidentialDescriptionItem> ResidentialOtherDescriptionItems { get; set; }
}


public class ResidentialDescriptionItem : Entity<int>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ResidentialDescriptionItemId { get; set; }

    public int InspectionId { get; set; }
    [ForeignKey("InspectionId")]
    public virtual Inspection Inspection { get; set; }

    //public int Inspection1Id { get; set; }
    //[ForeignKey("Inspection1Id")]
    //public virtual Inspection Inspection1 { get; set; }
}
公共类检查:实体
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int-InspectionId{get;set;}
[外汇(“报告”)]
public int ReportId{get;set;}
公共虚拟报表{get;set;}
....
公共虚拟ICollection ResidentialDescriptionItems{get;set;}
公共虚拟ICollection ResidentialTherDescriptionItems{get;set;}
}
公共类ResidentialDescriptionItem:实体
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int ResidentialDescriptionItemId{get;set;}
public int-InspectionId{get;set;}
[外键(“检查ID”)]
公共虚拟检查{get;set;}
//public int-Inspection1Id{get;set;}
//[外键(“检查1ID”)]
//公共虚拟检查检查1{get;set;}
}
我对第二个索引进行了多次尝试,并收到了同样多的错误。上述配置导致

无法确定服务器的主端 'MySolution.EntityFramework.ResidentialDescriptionItem_' 关系多个添加的实体可能具有相同的主键


我想保持一个完整的配置与导航两侧。如何首先使用代码和注释来实现这一点?

我认为不可能实现与注释的如此复杂的关系,但下面是一个演示,您需要如何覆盖您的DbContext.OnModelCreating

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;

namespace ConsoleApp3
{
    public class Parent
    {
        [Key]
        public int Id { get; set; }

        public virtual ICollection<Child> Children { get; set; }

        public virtual ICollection<Child> OtherChildren { get; set; }
    }

    public class Child
    {
        [Key]
        public int Id { get; set; }

        [ForeignKey("Parent")]
        public int? ParentId { get; set; }

        [ForeignKey("ParentId")]
        public virtual Parent Parent { get; set; }

        [ForeignKey("OtherParent")]
        public int? OtherParentId { get; set; }

        [ForeignKey("OtherParentId")]
        public virtual Parent OtherParent { get; set; }
    }

    public class MyDbContext : DbContext
    {
        public MyDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
        {
        }

        public DbSet<Parent> Parents { get; set; }

        public DbSet<Child> Children { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Parent>()
                .HasMany(x => x.Children)
                .WithOptional(x => x.Parent);

            modelBuilder.Entity<Parent>()
                .HasMany(x => x.OtherChildren)
                .WithOptional(x => x.OtherParent);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());

            var ctx = new MyDbContext("Data Source=DESKTOP-5PVJ0I5;Database=test1;Integrated Security=true");

            var parent = ctx.Parents.Add(new Parent());

            ctx.Children.Add(new Child()
            {
                OtherParent = parent
            });

            ctx.Children.Add(new Child()
            {
                Parent = parent
            });

            ctx.SaveChanges();

            parent = ctx.Parents
                .Include(x => x.Children)
                .Include(x => x.OtherChildren)
                .FirstOrDefault();
        }
    }
}
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity;
使用System.Linq;
名称空间控制台AP3
{
公共类父类
{
[关键]
公共int Id{get;set;}
公共虚拟ICollection子项{get;set;}
公共虚拟ICollection其他子对象{get;set;}
}
公营儿童
{
[关键]
公共int Id{get;set;}
[外键(“母公司”)]
public int?ParentId{get;set;}
[ForeignKey(“ParentId”)]
公共虚拟父级{get;set;}
[外键(“其他母公司”)]
public int?OtherParentId{get;set;}
[ForeignKey(“OtherParentId”)]
公共虚拟父对象OtherParent{get;set;}
}
公共类MyDbContext:DbContext
{
公共MyDbContext(字符串名称或连接字符串):基(名称或连接字符串)
{
}
公共数据库集父项{get;set;}
公共DbSet子项{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasMany(x=>x.Children)
.WithOptional(x=>x.Parent);
modelBuilder.Entity()
.HasMany(x=>x.OtherChildren)
.WithOptional(x=>x.OtherParent);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseAlways());
var ctx=new MyDbContext(“数据源=DESKTOP-5PVJ0I5;数据库=test1;集成安全性=true”);
var parent=ctx.Parents.Add(newparent());
ctx.Children.Add(新的子对象()
{
OtherParent=父
});
ctx.Children.Add(新的子对象()
{
父=父
});
ctx.SaveChanges();
parent=ctx.Parents
.包括(x=>x.儿童)
.包括(x=>x.OtherChildren)
.FirstOrDefault();
}
}
}