簡體   English   中英

C#實體框架一對多關系,自定義鍵

[英]C# Entity Framework one-to-many relationships, custom key

我有一個基於簡單外鍵的,在EF數據庫代碼中定義的良好的自動一對多關系。

public class MyCategory
{
    public int Id { get; set; }

    public MyItems Items { get; set; }
}

public class MyItems : List<MyItem> { }

public class MyItem
{
    public int Id { get; set; }

    public int MyCategoryId { get; set; }

    public string ItemsContents { get; set; }
}

這樣,每當我向數據庫添加新的MyCategory並使用SaveChanges() ,它將自動將所有MyItem的相關列表添加到各自的MyItems數據庫表中。 現在,我的領導者提出了一個新的要求,即如果表被重建並且索引ID丟失,則外鍵必須是Id以外的其他非自動索引int屬性。 因此,我們提出了以下建議:

public class MyCategory
{
    public int Id { get; set; }

    public int MyCategoryId { get; set; }

    public MyItems Items { get; set; }
}

public class MyItems : List<MyItem> { }

public class MyItem
{
    public int Id { get; set; }

    public int MyCategoryId { get; set; }

    public string ItemsContents { get; set; }
}

新的想法是在“一個”表中使用與“許多”表中使用的相同名稱的鍵。 據推測, MyCategoryId將被設置為MyCategory對象,並將其設置到數據庫中,並且所有MyItem都會像以前一樣自動添加,但是它們的MyCategoryId將與MyCategory相同。

問題是, MyItemMyCategoryId仍從MyCategory Id中提取。 我嘗試進行[ForeignKey]屬性到處放置,並使用OnModelCreating(DbModelBuilder modelBuilder)顯式將MyCategory.MyCategoryId映射到MyItem.MyCategoryId嘗試,但是並沒有取得成功,因此在任何可能的了解OnModelCreating(DbModelBuilder modelBuilder)都需要幫助的人。 謝謝!

這是我嘗試用來實際添加記錄的功能。

 private void AddMyCategory(MyCategory myCat)
 {
   int prevId = 0;
   var prevFoundMyCategory = _context.MyCategories.OrderByDescending(m => m.MyCategoryId).Take(1);
   if(prevFoundMyCategory.FirstOrDefault() != null)
   {
     prevId = prevFoundMyCategory.First().MyCategoryId;
   }
   int nextId = prevId + 1;
   myCat.MyCategoryId = nextId;
   _context.MyCategories.Add(myCat);
   _context.SaveChanges();
 }

您可能會說,如果有可能讓EF自動執行此操作,我將盡量避免使用此行:

   foreach(var x in myCat.Items)
   {
     x.MyCategoryId = nextId;
   }

實際上,不,即使這樣設置也不行,因為EF用MyCategoryId屬性覆蓋了我設置的所有內容...

好了,ForeignKey和虛擬集合使我走了一半,但是我錯過了[Key]屬性在正確的位置! 最后,它應該看起來像:

public class MyCategory
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Key]
    public int MyCategoryId { get; set; }

    public List<MyItem> Items { get; set; }
}


public class MyItem
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int MyCategoryId { get; set; }

    public string ItemsContents { get; set; }

    [ForeignKey("MyCategoryId")]
    public virtual MyCategory MyCategory { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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