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添加竖起大拇指!