[英]Alternatives to using join entities now that EF Core 6.0 DBContext scaffolding no longer maps simple join tables to explicit entity types
我目前正在將一個大型數據庫優先項目升級到 EF Core 6.0。 可以在此處找到標題中描述的突破性 EF Core 6.0 腳手架更改的詳細信息: https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/breaking-變化#多對多。 我也知道可用的緩解措施和開放的 efcore 問題以選擇性地恢復連接表。
從上面的文章:
當連接實體類型只包含多對多關系的兩個外鍵時,很少需要直接使用它。
在我正在從事的項目中,這根本不是真的。 我的問題是:
例如,考慮一個人和一個事物之間的多對多關系。 在 EF Core 6.0 中,連接實體不再可用:
public partial class PersonThing
{
public int PersonId { get; set; }
public int ThingId { get; set; }
public virtual Person Person { get; set; }
public virtual Thing Thing { get; set; }
}
而這些表是用多對多關系映射的:
public partial class Person
{
public Person()
{
Thing = new HashSet<Thing>();
}
public int PersonId { get; set; }
public string PersonName { get; set; }
public virtual ICollection<Thing> Thing { get; set; }
}
public partial class Thing
{
public Thing()
{
Person = new HashSet<Person>();
}
public int ThingId { get; set; }
public string ThingName { get; set; }
public virtual ICollection<Person> Person { get; set; }
}
以前可以僅使用 id 更新現有的人和物之間的關系:
public void UpdateThings(IReadOnlyCollection<int> thingIds)
{
// sync PersonThings
var syncQueue = SynchronisationHelper.GetSynchronisationQueue(thingIds, _model.PersonThing, (s, d) => s == d.ThingId);
foreach (var thingId in syncQueue.Inserts)
{
var personThing = new Database.Model.PersonThing
{
PersonId = _model.PersonId,
ThingId = thingId
};
_model.PersonThing.Add(personThing);
}
foreach (var personThing in syncQueue.Deletes)
{
_context.PersonThing.Remove(personThing);
}
}
沒有訪問連接實體類型的替代方法是什么? 您必須從上下文中加載相關實體才能創建關系,還是有更好的方法來實現這一點?
public void UpdateThings(IReadOnlyCollection<int> thingIds)
{
// sync Things
var syncQueue = SynchronisationHelper.GetSynchronisationQueue(thingIds, _model.Thing, (s, d) => s == d.ThingId);
foreach (var thingId in syncQueue.Inserts)
{
var thing = _context.Thing.Single(t => thingId == t.ThingId);
_model.Thing.Add(thing);
}
foreach (var thing in syncQueue.Deletes)
{
_model.Thing.Remove(thing);
}
}
基於對可選恢復連接表的開放式 efcore 問題的評論,我很滿意使用連接實體類型是一種完全有效的數據庫優先方法,使用(或不使用)它們是偏好/風格的問題。 map 在 EF Core 6.0 中使用腳手架加入實體類型已經有了緩解措施,希望這個問題得到解決,這樣就可以在沒有變通辦法的情況下實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.