簡體   English   中英

實體框架:與抽象類的多對多關系,是否在不查詢數據庫的情況下進行修改?

[英]Entity Framework: Many-to-Many relations with abstract classes, modify without querying database?

使用實體框架,如果我具有以下模型:

class Asset {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<AssetGroup> Groups { get; set; }
}

class AssetGroup {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Asset> Assets { get; set; }
}

將現有資產添加到給定組中而不必查詢數據庫以加載有問題的資產相對簡單:

using(var context = new MyContext()) {
    AssetGroup assetGroup = context.AssetGroups.Find(groupId);

    // Create a fake Asset to avoid a db query
    Asset temp = context.Assets.Create();
    temp.Id = assetId;
    context.Assets.Attach(temp);

    assetGroup.Assets.Add(temp);
    context.SaveChanges();
}

但是,我現在遇到的問題是,我已經擴展了模型,以便有多個資產類型實現為繼承層次結構。 在此過程中,資產類被抽象化,因為沒有特定類型的資產沒有意義:

abstract class Asset {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<AssetGroup> Groups { get; set; }
}

class SpecificAsset1 : Asset {
    public string OneProperty { get; set; }
}

class SpecificAsset2 : Asset {
    public string OtherProperty { get; set; }
}

問題在於,現在Create()調用將引發InvalidOperationException因為“無法創建抽象類的實例”,這當然是有道理的。

因此,問題是,如何在不必從數據庫中獲取資產的情況下更新多對多關系?

您可以使用DbSet<T>的通用Create<T>方法來創建派生實體對象。

var temp1 = context.Assets.Create<SpecificAsset1>();

然后繼續使用temp1作為存根實體 ,就像您已經做過的那樣。

暫無
暫無

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

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