在EF Core中的类之间添加多对多关系

时间:2018-10-02 17:01:48

标签: c# ef-core-2.1

我正在使用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; }

1 个答案:

答案 0 :(得分:1)

EF Core 2.1尚不支持没有实体类来表示联接表的多对多关系。

但是您可以为连接表包括一个实体类,并映射两个单独的一对多关系。例如,假设您正在创建一个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(.. => .....);