簡體   English   中英

實體框架,帶有where條件的相關實體的常規加載

[英]Entity Framework, Generic loading of related entities with a where condition

我正在嘗試創建一個函數,該函數通常使用過濾器加載相關的子實體。

我所有的實體都來自我自己的基類“ BusinessObject”

public abstract class BusinessObject : BaseObject, IBaseObject, ILocalObject
{
    [Browsable(false)]
    [Key]
    public int ID { get; set; }

    [Browsable(false)]
    public int? HqID { get; set; }

    private bool _deleted;
    [Browsable(false)]
    public bool Deleted
    {
        get { return _deleted; }
        set { CheckPropertyChanged(ref _deleted,  value); }
    }
}

我創建了以下函數,當提供一個實體時,它將加載所有相關的子對象。 定義實體時,所有子集合都由我自己的屬性“ EntityChildCollectionAttribute”標記,因此我可以輕松找到要加載的集合。

    public virtual void OnLoadEntityChildren(object entity)
    {
        var propNames = entity.GetPropertyNames();
        foreach (var propName in propNames.Where(propName => entity.PropertyHasCustomAttribute(propName, typeof(EntityChildCollectionAttribute))))
        {
            MyData.Entry(entity).Collection(propName).Load();                               
        }
    }

這很可愛! 當我想過濾子集合時,我的問題來了。

在這種情況下,我只想加載Deleted == false的子實體。

我不知道該怎么做!

我已經嘗試了很多次,並替換了MyData.Entry(entity).Collection(propName).Load();

MyData.Entry(entity).Collection(propName).Query().Cast<BusinessObject>().Where(x=>x.Deleted.Equals(false)).Load();

編譯但是我得到了錯誤;

“無法將類型'FmOrderProcessing.Entities.OpDocumentDetail'強制轉換為'FwBaseEntityFramework.BusinessObject'。LINQto Entities僅支持強制轉換EDM基本類型或枚舉類型。”

任何幫助/指針/答案將不勝感激

提前致謝

長矛

我正在實現“軟刪除”模式,這意味着將數據庫中的記錄標記為已刪除而不是刪除(出於審計和復制目的)。

所有實體均來自具有bool Deleted屬性的基本定義。

我在這里找到了答案:

https://www.nuget.org/packages/EntityFramework.DynamicFilters

該軟件包允許在數據上下文中定義全局過濾器。 我用OnModelCreating覆蓋中的一行代碼解決了我的問題。

modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);

篩選器函數全局應用於所有呈現(在我的情況下)IBaseObject接口的實體。

我希望這對其他有類似問題的人有幫助

暫無
暫無

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

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