Добавление отношений «многие ко многим» между классами в EF Core - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над базой данных с кодом, использующей EF Core, и у меня возникают проблемы с установлением правильных отношений между сущностями.

У меня есть модель под названием Customer, которая представляет некоторую основную информацию о клиенте, кака также модель под названием Пользователь, которая представляет пользователя нашего сайта.Эти пользователи будут иметь доступ ко многим клиентам, и у клиентов будет много пользователей, которые имеют к ним доступ (отношение «многие ко многим»).

Однако всякий раз, когда я пытаюсь добавить существующих клиентов в список пользователя, я получаюошибка, указывающая на то, что Клиент уже существует.

// 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 голосов
/ 02 октября 2018

Отношения многие-ко-многим без класса сущности для представления таблицы соединения еще не поддерживаются в 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(.. => .....);
...