[英]One-to-many relationship on custom columns
我有兩個模型,我想在它們之間指定一對多的關系,但我似乎無法讓它工作。 以下是模型:
public class Apple
{
public int Id { get; set; }
public int ThingId { get; set; }
public List<Banana> Bananas { get; set; }
}
public class Banana
{
public int Id { get; set; }
public int ThingId { get; set; }
[ForeignKey("ThingId")]
public Apple Apple { get; set; }
}
如您所見, Apple
類和Banana
類中都有一個名為ThingId
的列,這就是我希望將這些關聯加入的方式。 這是一個舊數據庫,因此我無法更改列名。 但是,當我運行這樣的查詢時,即使我知道它們存在,我也沒有得到B
對象的數組。
var thing = _context.Apples.Include(a => a.Bananas).FirstOrDefault();
// thing - properly populated but the "Bananas" association is null
關於如何使用這樣的自定義列使其正常工作的任何想法(最好沒有流暢的語法,因為我更喜歡屬性,但如果有必要,這沒什么大不了的)。
謝謝!
編輯: Rafi 下面的答案中的鏈接成功了。 這是我最終通過 Fluent API 使用的內容。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Banana>()
.HasOne(b => b.Apple)
.WithMany(a => a.Bananas)
.HasForeignKey(a => a.ThingId)
.HasPrincipalKey(b => b.ThingId);
}
嘗試修改您的數據模型,如下例所示:
public class Apple
{
public int Id { get; set; }
public List<Banana> Bananas { get; set; }
}
public class Banana
{
public int Id { get; set; }
[ForeignKey("Apple")]
public int AppleId { get; set; }
public Apple Apple { get; set; }
}
更新:
如果ThingId
是不是主鍵可以考慮使用GroupJoin
如下:
_context.Apples.GroupJoin(
bana_context.Bananas,
apple => apple.ThingId,
banana => banana.ThingId,
(apple, bananas) =>
{
apple.bananas = bananas.ToList();
return apple;
}
)
鑒於您的情況,我們將不得不設置一些約束以使關系起作用。 在這種情況下,每個蘋果都有一個名為Id
的unique key
,這將是一個可行的屬性,可用作Apple
相關實體的外鍵。 但是 SQL 確實允許將其他列用作外鍵,前提是它們對於每一行都是唯一的,在您的情況下是Apple
。
因此,為了實現這一點,讓我們看看您給定的代碼:
public class Apple
{
public int Id { get; set; }
public int ThingId { get; set; }
public List<Banana> Bananas { get; set; }
}
public class Banana
{
public int Id { get; set; }
public int ThingId { get; set; }
public Apple Apple { get; set; }
}
根據您的代碼,我們必須使 ThingId 對每個Apple
ThingId
唯一的。 所以讓我們用 Fluent API 配置它:
modelBuilder.Entity<Apple>()
.HasIndex(ux=>ux.ThingId)
.IsUnique()
.Isclustered(false);
然后,繼續配置與fluend API的一對多關系:
modelBuilder.Entity<Apple>()
.HasMany(apple => apple.Bananas)
.WithOne(banana => banana.Apple)
.HasForeignKey(banana => banana.ThingId)
.Isrequired(false)
.OnDelete(DeleteBehavior.Cascade); // You can set the DeleteBehavior here
然后您的關系將被正確設置。
結論
讓我們回顧一下, ForeignKey
必須是來自外部實體的唯一鍵。 我總是建議您使用 FluentAPI 來配置您的關系,因為您可以控制該關系的許多屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.