[英]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
相同。
問題是, MyItem
的MyCategoryId
仍從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用MyCategory
的Id
屬性覆蓋了我設置的所有內容...
好了,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.