1 回答

TA貢獻1824條經驗 獲得超6個贊
您可能需要使用顯式映射來實現此目的:
在您的上下文的 OnModelCreating() 中:
modelBuilder.Entity<User>()
.HasOptional(u => u.Promotion)
.WithRequired(p => p.Pilote)
.Map(u => u.MapKey("PiloteId"); // EF6
// .HasForeignKey("PilotId") // EF Core
這假設用戶可能有促銷活動,也可能沒有促銷活動,但所有促銷活動都有試點。Promotion.Users 可能會按照慣例在促銷表上使用 UserId 進行映射,但如果存在任何問題:
但是,這種方法有一個很大的警告,它與模式有關,而不是 EF。沒有任何限制/保護措施可以確保飛行員是與促銷相關的用戶之一。PiloteId 可以指向任何用戶,并且該用戶的 promotionId 可能不同。
在任何情況下,管理誰是飛行員的邏輯都需要通過代碼來完成,但這意味著要么檢查有效組合的 ID,要么像這樣:
如果一個用戶只能與 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;
}
}
如果可以將用戶分配給多個促銷活動,那么您需要更新架構和映射以支持用戶和促銷活動之間的多對多關系,例如包含 UserId 和 PromotionId 的 UserPromotions 表。在這種情況下,我會考慮在此表/鏈接實體中分配 IsPilote,但這同樣需要邏輯來確保每次促銷圍繞 1 個試點進行規則,以及用戶是否可以成為多個促銷的試點。
- 1 回答
- 0 關注
- 64 瀏覽
添加回答
舉報