Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心EF多对多引用表_C#_Asp.net_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# ASP.NET核心EF多对多引用表

C# ASP.NET核心EF多对多引用表,c#,asp.net,asp.net-core,entity-framework-core,C#,Asp.net,Asp.net Core,Entity Framework Core,我正在尝试使用联系人表创建用户。我不确定我是否做得对,因为我没有声明添加了一列 实体: public class User { public int Id { get; set; } public bool IsAvailable { get; set; } public List<Contact> Contacts { get; set; } } public class Contact { public int UserId { get; set

我正在尝试使用联系人表创建用户。我不确定我是否做得对,因为我没有声明添加了一列

实体:

public class User
{
    public int Id { get; set; }
    public bool IsAvailable { get; set; }
    public List<Contact> Contacts { get; set; }
}

public class Contact
{
    public int UserId { get; set; }
    public int ContactUserId { get; set; }

    public User User { get; set; }
    public User ContactUser { get; set; }
}
公共类用户
{
公共int Id{get;set;}
公共布尔值可用{get;set;}
公共列表联系人{get;set;}
}
公共类联系人
{
public int UserId{get;set;}
public int ContactUserId{get;set;}
公共用户{get;set;}
公共用户联系人用户{get;set;}
}
映射:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contact>()
        .HasKey(x => new { x.UserId, x.ContactUserId });

    modelBuilder.Entity<Contact>()
        .HasOne(x => x.User)
        .WithMany(x => x.Contacts)
        .HasForeignKey(x => x.UserId);

    modelBuilder.Entity<Contact>()
        .HasOne(x => x.ContactUser)
        .WithMany(x => x.Contacts)
        .HasForeignKey(x => x.ContactUserId);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(x=>new{x.UserId,x.ContactUserId});
modelBuilder.Entity()
.HasOne(x=>x.User)
.具有多个(x=>x个联系人)
.HasForeignKey(x=>x.UserId);
modelBuilder.Entity()
.HasOne(x=>x.ContactUser)
.具有多个(x=>x个联系人)
.HasForeignKey(x=>x.ContactUserId);
}
结果是:

migrationBuilder.CreateTable(
    name: "Contact",
    columns: table => new
    {
        UserId = table.Column<int>(nullable: false),
        ContactUserId = table.Column<int>(nullable: false),
        UserId1 = table.Column<int>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Contact", x => new { x.UserId, x.ContactUserId });
        table.ForeignKey(
            name: "FK_Contact_User_ContactUserId",
            column: x => x.ContactUserId,
            principalTable: "User",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
        table.ForeignKey(
            name: "FK_Contact_User_UserId1",
            column: x => x.UserId1,
            principalTable: "User",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    });
migrationBuilder.CreateTable(
姓名:“联系人”,
列:表=>new
{
UserId=table.Column(可空:false),
ContactUserId=table.Column(可空:false),
UserId1=table.Column(可空:true)
},
约束:表=>
{
表.PrimaryKey(“PK_Contact”,x=>new{x.UserId,x.ContactUserId});
表1.外键(
名称:“FK\U联系人\U用户\U联系人用户ID”,
列:x=>x.ContactUserId,
原则性:“用户”,
主栏:“Id”,
onDelete:引用。级联);
表1.外键(
名称:“FK_联系人_用户_用户ID1”,
列:x=>x.UserId1,
原则性:“用户”,
主栏:“Id”,
onDelete:referentialiction.Restrict);
});
真正的问题是:


联系人中的UserId1列来自哪里?我的定义有问题吗?谢谢

在contact表上增加一个UserId1的原因是您将contact对象上的User和ContactUser关联的另一端指定为User对象上的Contacts,这是不正确的。结果,EF会忽略它,并为用户对象上的联系人创建另一个关联,并将其映射到联系人表上的UserId1列

解决此问题的一种方法是在用户对象上创建另一个联系人列表,并相应地映射它:

public class User
{
    public int Id { get; set; }
    public bool IsAvailable { get; set; }

    public List<Contact> Contacts { get; set; }
    public List<Contact> ContactUsers { get; set; }
}

modelBuilder.Entity<Contact>()
    .HasOne(x => x.User)
    .WithMany(x => x.Contacts)
    .HasForeignKey(x => x.UserId);

modelBuilder.Entity<Contact>()
    .HasOne(x => x.ContactUser)
    .WithMany(x => x.ContactUsers)
    .HasForeignKey(x => x.ContactUserId)
    .OnDelete(DeleteBehavior.Restrict);
公共类用户
{
公共int Id{get;set;}
公共布尔值可用{get;set;}
公共列表联系人{get;set;}
公共列表联系人用户{get;set;}
}
modelBuilder.Entity()
.HasOne(x=>x.User)
.具有多个(x=>x个联系人)
.HasForeignKey(x=>x.UserId);
modelBuilder.Entity()
.HasOne(x=>x.ContactUser)
.WithMany(x=>x.ContactUsers)
.HasForeignKey(x=>x.ContactUserId)
.OnDelete(DeleteBehavior.Restrict);

这将生成所需的模式:


联系人表上出现额外的UserId1是因为您将联系人对象上的用户和联系人用户关联的另一端指定为用户对象上的联系人,这是不正确的。结果,EF会忽略它,并为用户对象上的联系人创建另一个关联,并将其映射到联系人表上的UserId1列

解决此问题的一种方法是在用户对象上创建另一个联系人列表,并相应地映射它:

public class User
{
    public int Id { get; set; }
    public bool IsAvailable { get; set; }

    public List<Contact> Contacts { get; set; }
    public List<Contact> ContactUsers { get; set; }
}

modelBuilder.Entity<Contact>()
    .HasOne(x => x.User)
    .WithMany(x => x.Contacts)
    .HasForeignKey(x => x.UserId);

modelBuilder.Entity<Contact>()
    .HasOne(x => x.ContactUser)
    .WithMany(x => x.ContactUsers)
    .HasForeignKey(x => x.ContactUserId)
    .OnDelete(DeleteBehavior.Restrict);
公共类用户
{
公共int Id{get;set;}
公共布尔值可用{get;set;}
公共列表联系人{get;set;}
公共列表联系人用户{get;set;}
}
modelBuilder.Entity()
.HasOne(x=>x.User)
.具有多个(x=>x个联系人)
.HasForeignKey(x=>x.UserId);
modelBuilder.Entity()
.HasOne(x=>x.ContactUser)
.WithMany(x=>x.ContactUsers)
.HasForeignKey(x=>x.ContactUserId)
.OnDelete(DeleteBehavior.Restrict);

这将生成所需的模式:


您是在尝试建立n:n关系还是1:n关系?从您的模型来看,似乎您有一个用户有n个联系人,这不是多对多而是一对多,如果我没有弄错的话。@HotTowelie它是1:n到
联系人
,然后是n:1到
联系人。ContactUser
。因此,
User
与其自身是n:n。可能与之相关:
User.Contacts
不能既是从
User
到其
ContactUser
s的导航属性,也是同时向相反方向移动的导航属性。其中一个应该从
User
实体中配置,另一个配置为无参数的
HasMany()
。您正在尝试建立n:n或1:n关系吗?从您的模型来看,似乎您有一个用户有n个联系人,这不是多对多而是一对多,如果我没有弄错的话。@HotTowelie它是1:n到
联系人
,然后是n:1到
联系人。ContactUser
。因此,
User
与其自身是n:n。可能与之相关:
User.Contacts
不能既是从
User
到其
ContactUser
s的导航属性,也是同时向相反方向移动的导航属性。其中一个应该从
用户
实体中配置,另一个配置为无参数的
HasMany()
。非常感谢您,同时也感谢OnDelete添加!非常感谢,同时也为OnDelete添加竖起大拇指!