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