Вам, вероятно, потребуется использовать явное сопоставление для достижения этого:
В OnModelCreating () для вашего контекста:
modelBuilder.Entity<User>()
.HasOptional(u => u.Promotion)
.WithRequired(p => p.Pilote)
.Map(u => u.MapKey("PiloteId"); // EF6
// .HasForeignKey("PilotId") // EF Core
Это предполагает, что пользователь может иметь, а может и не иметьАкция, но во всех акциях есть Pilot.Поощрение, вероятно, будет отображаться в соответствии с соглашением, используя UserId в таблице продвижения, но если там есть какая-либо проблема:
Однако при таком подходе есть большая оговорка, касающаяся схемы, а не EF.,Нет ограничений / мер, которые гарантировали бы, что Пилот является одним из Пользователей, связанных с рекламной акцией.PiloteId может указывать на любого пользователя, и его промо-идентификатор может отличаться.
В любом случае логика управления пилотом должна выполняться с помощью кода, но это означает, что либо проверка идентификаторов на действительностькомбинации или что-то вроде:
Если пользователь может быть связан только с 1 промоушеном, и один пользователь в этом промоушене может быть пилотом, то вы можете рассмотреть возможность добавления флага для пользователя под названием «IsPilot».
Затем в акции:
public virtual ICollection<User> Users { get; set; } = new List<User>();
[NotMapped]
public User Pilote
{
get { return Users.SingleOrDefault(u => u.IsPilote); }
set
{
var newPilote = Users.Single(u => u.UserId == value.UserId); // Ensure the user nominated for Pilote is associated with this Promotion.
var existingPilote = Pilote;
if (existingPilote != null)
existingPilote.IsPilote = false;
newPilote.IsPilote = true;
}
}
Если пользователи могут быть назначены для нескольких рекламных акций, вам нужно обновить схему и сопоставления, чтобы поддерживать отношение «многие ко многим» между пользователем и рекламными акциями, напримерв виде таблицы UserPromotions, содержащей UserId и PromotionId.В этом случае я хотел бы рассмотреть вопрос о назначении IsPilote в этой табличной / связывающей сущности, но опять же, для этого потребуется логика, обеспечивающая, чтобы правила составляли примерно 1 пилот-сигнал на повышение, а также мог ли пользователь быть пилотом для более чем одного повышения.