簡體   English   中英

現在 EF Core 6.0 DBContext 腳手架不再將簡單的連接表映射到顯式實體類型,因此可以使用連接實體的替代方法

[英]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.

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