我需要存盤一個元素串列,我的物體是有序的。但是因為它是多對多關系,而不是一對多關系,所以我不能只為我的子物體添加排序索引。例如考慮這些物體:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public List<Dish> FavoriteDishes { get; set; }
}
public class Dish
{
public int Id { get; set; }
public string Name { get; set; }
public List<Person> People { get; set; }
}
如您所見,這是一個多對多關系,一個人有一個他們喜歡吃的最喜歡的菜的串列,每道菜都有一個喜歡這道菜的人的串列。
當要考慮喜愛菜肴的串列時,例如排名,如前十名串列,問題就出現了。現在需要有一種方法來為這些元素創建一個已定義但用戶可編輯的順序。此外,串列不應包含重復項。
對于屬于多人的每道菜,我不能只在此處添加索引屬性。我想過使用類似的東西List<Tuple<int,Dish>>來存盤每道菜的索引,但我不知道如何設定它,因為我對 Entity Framework Core 沒有太多經驗。
對于多對多關系,我在這個問題上找不到太多問題。我能找到的只是一對多(比如將 index 屬性添加到子物體)或關于回傳按某些屬性排序的串列(比如get => SomeList.Sort(...))。
我現在能想到的唯一方法是將索引/id 對串列存盤在未映射的屬性中,并將其存盤為字串以在從資料庫中存盤/檢索時保持排序。但這看起來確實很乏味,尤其是在嘗試使這些與用戶編輯的實際串列保持同步時。手動實作多對多關系的 PersonDish 元素而不是使用自動生成的元素似乎也不是很簡單(同樣,使用 ef 的經驗不多)。而且這兩種方法都必須為每個需要排序的串列屬性完成,這使得這不是很可擴展。
有關如何解決此問題的任何提示或建議?
uj5u.com熱心網友回復:
我認為您需要明確定義第三個表并添加一個 Rating 屬性
public class PersonDish
{
public int PersonId { get; set; }
public int DishId { get; set; }
public int? Rating {get; set;}
public virtual Person Person { get; set; }
public virtual Dish Dish { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<PersonDish> PersonDishes { get; set; }
}
public class Dish
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<PersonDish> PersonDishes { get; set; }
}
和 dbcontext
modelBuilder.Entity<PersonDish>( b =>
{
b.HasKey( k=> new { k.PersonId, k.DishId });
b.HasIndex(i=> i.PersonId);
b.HasIndex(i=> i.DishId);
b.HasOne( a=> a.Dish)
.WithMany(m=> m.PersonDishes)
.HasForeignKey(d => d.DishId)
.OnDelete(DeleteBehavior.ClientSetNull)
.IsRequired();
b.HasOne(a=>a.Person)
.WithMany(m=>m.PersonDishes)
.HasForeignKey(k=> k.PersonId)
.OnDelete(DeleteBehavior.ClientSetNull)
.IsRequired();
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/393675.html
