簡體   English   中英

自定義列上的一對多關系

[英]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;
  }
)

鑒於您的情況,我們將不得不設置一些約束以使關系起作用。 在這種情況下,每個蘋果都有一個名為Idunique 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM