Ваше отображение не соответствует вашим целям. Если вы хотите рассматривать OrganisationUser
как промежуточную сущность между Organisation
и User
, вы должны создать отношения между Organisation
и OrganisationUser
и между User
и OrganisationUser
, а не между Organisation
и User
.
Из-за промежуточного объекта, который содержит свои скалярные свойства, вы не можете создать отображение «многие ко многим». EF не поддерживает отношения «многие ко многим» с «полезной нагрузкой». Вам нужны два отношения один ко многим:
public class Organisation : EntityBase<int>, IAggregateRoot
{
// ...
// this replaces the Users collection
public virtual ICollection<OrganisationUser> OrganisationUsers { get; set; }
}
public class User : EntityBase<Guid>, IAggregateRoot
{
// ...
// this replaces the Organisations collection
public virtual ICollection<OrganisationUser> OrganisationUsers { get; set; }
}
public class OrganisationUser : EntityBase<int>, IAggregateRoot
{
public int OrganisationId { get; set; }
public Organisation Organisation { get; set; }
public Guid UserId { get; set; }
public User User { get; set; }
// ... "payload" properties ...
}
В Fluent API вы должны заменить отображение «многие ко многим» следующим:
modelBuilder.Entity<Organisation>()
.HasMany(o => o.OrganisationUsers)
.WithRequired(ou => ou.Organisation)
.HasForeignKey(ou => ou.OrganisationId);
modelBuilder.Entity<User>()
.HasMany(u => u.OrganisationUsers)
.WithRequired(ou => ou.User)
.HasForeignKey(ou => ou.UserId);
Ваш производный DbContext
может также содержать отдельный набор для сущности OrganisationUser
:
public IDbSet<OrganisationUser> OrganisationUsers { get; set; }
Теперь очевидно, как вы записываете что-то в промежуточную таблицу:
var newOrganisationUser = new OrganisastionUser
{
OrganisationId = 5,
UserId = 8,
SomePayLoadProperty = someValue,
// ...
};
context.OrganisastionUsers.Add(newOrganisastionUser);
context.SaveChanges();
Если вы хотите убедиться, что каждая пара OrganisationId
и UserId
может существовать в таблице ссылок только один раз, было бы лучше создать составной первичный ключ из этих двух столбцов, чтобы обеспечить уникальность в базе данных. использования отдельного Id
. В Fluent API это будет:
modelBuilder.Entity<OrganisationUser>()
.HasKey(ou => new { ou.OrganisationId, ou.UserId });
Подробнее о модели такого типа и о том, как с ней работать, можно узнать здесь:
Сначала создайте код, многие ко многим, с дополнительными полями в таблице ассоциаций