在 EF Core 中添加 类 之间的多对多关系
Adding Many To Many relationships between classes in EF Core
我正在使用 EF Core 开发代码优先的数据库,但在正确建立实体之间的关系时遇到了问题。
我有一个名为 Customer 的模型,它代表一些基本的客户信息,还有一个名为 User 的模型代表我们网站的用户。这些用户将有权访问许多客户,而客户将拥有许多有权访问他们的用户(多对多关系)。
但是,每当我尝试将现有客户添加到用户列表时,我都会收到一条错误消息,指出该客户已经存在。
// retrieves the current list of Customers
var current = GetCustomersByUserId(userId.ToString())?.Select(x => x.Id).ToList();
var toAdd = customers.Where(x => !current.Any(y => y.Equals(x.Id)));
customers.ForEach(x => x.Id = _data.Customers.First(y => y.SalesOrg.Equals(x.SalesOrg) && y.DistributionChannel.Equals(y.DistributionChannel) && y.Division.Equals(x.Division)).Id);
var affil = _data.Users.FirstOrDefault(x => x.Id.Equals(userId));
if (affil == null)
{
affil = new User() { UserId = userId, Customers = customers, Id = Guid.NewGuid() };
// Where the error occurs
_data.Users.Add(affil);
}
else
{
affil.Customers.AddRange(customers);
}
_data.SaveChanges();
return customers;
在上下文 OnModelCreating 方法中,我有以下内容:
modelBuilder.Entity<User>()
.HasMany(x => x.Customers);
modelBuilder.Entity<Customer>()
.HasMany(x => x.Users);
并且在每个 类 中,我将另一个引用为 属性,如下所示:
public List<Customer> Customers { get; set; }
public List<User> Users { get; set; }
EF Core 2.1 尚不支持没有实体 class 来表示联接 table 的多对多关系。
但是您可以为联接 table 包含一个实体 class 并映射两个单独的一对多关系。例如,假设您正在创建一个 class UserCustomer,您在 OnModelCreating 中的代码将是:
modelBuilder.Entity<UserCustomer>()
.HasKey(t => new {....});
modelBuilder.Entity<UserCustomer>()
.HasOne(uc => uc.User)
.WithMany(u => u.UsersCustomers )
.HasForeignKey(.. => ....);
modelBuilder.Entity<UserCustomer >()
.HasOne(uc => uc.Customer)
.WithMany(c => c.UsersCustomers)
.HasForeignKey(.. => .....);
我正在使用 EF Core 开发代码优先的数据库,但在正确建立实体之间的关系时遇到了问题。
我有一个名为 Customer 的模型,它代表一些基本的客户信息,还有一个名为 User 的模型代表我们网站的用户。这些用户将有权访问许多客户,而客户将拥有许多有权访问他们的用户(多对多关系)。
但是,每当我尝试将现有客户添加到用户列表时,我都会收到一条错误消息,指出该客户已经存在。
// retrieves the current list of Customers
var current = GetCustomersByUserId(userId.ToString())?.Select(x => x.Id).ToList();
var toAdd = customers.Where(x => !current.Any(y => y.Equals(x.Id)));
customers.ForEach(x => x.Id = _data.Customers.First(y => y.SalesOrg.Equals(x.SalesOrg) && y.DistributionChannel.Equals(y.DistributionChannel) && y.Division.Equals(x.Division)).Id);
var affil = _data.Users.FirstOrDefault(x => x.Id.Equals(userId));
if (affil == null)
{
affil = new User() { UserId = userId, Customers = customers, Id = Guid.NewGuid() };
// Where the error occurs
_data.Users.Add(affil);
}
else
{
affil.Customers.AddRange(customers);
}
_data.SaveChanges();
return customers;
在上下文 OnModelCreating 方法中,我有以下内容:
modelBuilder.Entity<User>()
.HasMany(x => x.Customers);
modelBuilder.Entity<Customer>()
.HasMany(x => x.Users);
并且在每个 类 中,我将另一个引用为 属性,如下所示:
public List<Customer> Customers { get; set; }
public List<User> Users { get; set; }
EF Core 2.1 尚不支持没有实体 class 来表示联接 table 的多对多关系。
但是您可以为联接 table 包含一个实体 class 并映射两个单独的一对多关系。例如,假设您正在创建一个 class UserCustomer,您在 OnModelCreating 中的代码将是:
modelBuilder.Entity<UserCustomer>()
.HasKey(t => new {....});
modelBuilder.Entity<UserCustomer>()
.HasOne(uc => uc.User)
.WithMany(u => u.UsersCustomers )
.HasForeignKey(.. => ....);
modelBuilder.Entity<UserCustomer >()
.HasOne(uc => uc.Customer)
.WithMany(c => c.UsersCustomers)
.HasForeignKey(.. => .....);