2011-03-31 48 views
0

我想找一個解決方法來完成一個簡單的解決方案,以通過EF自動化某些操作。 我需要它在保存和檢索過程中接管修改查詢結果,但這個類將能夠使任何類型實體的工作。Entity Wrapper - 自定義

例如:我有一個MyTestDb。所以在我的C#項目中,我創建了一個新的實體模型(MyTEstDbModel.edmx),並生成了相關的POCO類。 好,興趣點可能是實現一個新的定製類像以下:

class Example 
{ 
    private ObjectContext _context; 
    private Example(ObjectContext obj) { _context = obj; } 

    public void Store(ObjectSet<???generic???> os) 
    { 
     // problem here: I dont't know the type contained in ObjectSet 
     // but if I Knew its type, I could make a work like this: 
     // -> foreach every instance in objectSet to check if exist some property 
     // via reflection, if i found them, then I set always the same values. 
     // Why this? Because all my db contains some common filed 
     // like (createdByUser, TimeToUpdate, and so on..), so it wold be boring 
     // setting all those fileds from any point of program. 
    } 

public void Retrive(ObjectSet<???generic???> os) 
{ 
    // here problem too: all my queries will be filtered by one or more value 
    // fileds, but I cannot use lambaExpression cos I don't Know the type 
    // contained in objectSet<..> 
} 
//.... 

最後,通過程序的任何點,代碼應該出現類似以下內容:

Example obj = new Example(myEntityContext); //-> global 

var result = myEntityContext.ObjectSetTyped.Where(..lambaExpression..condition) 
result.someProperty = "..."; 
obj.Store(result); // store method will fill all other boring filed automatically. 

誰能給我一些提示,幫助,關於我的問題的建議?

在此先感謝...

更新

現在,僅僅只有一個問題。我倒是過濾我的對象集通過檢索方法類似以下內容:

public void Retrieve<TEntity>(IQueryable<TEntity> ooo) where TEntity : IC 
{ 
    ooo = ooo.Where(p => p.Filed == "MyDefaultValue"); 
} 

但是,從外部方法,而不是對象集的結果是我的過濾器的影響。 怎麼這麼..?

MyEntities ent = new... 
MyWrapper wrap = new MyWrapper(); 
wrap.Retrieve(ent.Users); 

//這裏的問題 - >用戶對象集始終是相同的..

回答

1

定義,這將允許你這樣做接口。例如:

public interface IEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
} 

您需要在您的實體中「實施」此接口。例如,您可以修改T4模板生成實體或在部分類中實現它。這兩個屬性必須在模型中,因此實現中已經定義的只有聲明:

public partial class MyEntity : IEntity // That's all 
{ } 

現在,您可以定義Store,如:

public void Store<TEntity>(TEntity entity) where TEntity : IEntity 
{ 
    ... 
} 

同樣可以查詢做,但你可以例如定義自定義擴展方法:

public static IQueryable<TEntity> GetUserEntities(this IQueryable<TEntity> query, string user) 
    where TEntity : IEntity 
{ 
    return query.Where(e => e.CreatedBy == user); 
} 

你可以簡單的定義查詢,如:

var result = myEntityContext.MyEntities.GetUserEntities("someName"); 

另一種方法是定義簡單GetQuery上的自定義背景:

public IQueryable<T> GetQuery<T>() where T : IEntity 
{ 
    var query = GetObjectSetSomehow; 
    return query.ApplyGlobalConditions(); // Just another extension with your conditions 
} 

我不是存儲庫模式的大風扇,但通常你正在嘗試做的是接近通用的存儲庫,以便檢查示例this post。這只是一些可以進一步擴展的例子。

+0

Thnaks你很支持,但真正的問題恰恰是這樣的:我不」 t想要(由於任何原因)既不會修改T4模板也不會自動生成通過我的接口繼承的實體容器。所有我想要的是創建我的新類允許上述操作生成任何類型的實體.. – Bit 2011-03-31 12:12:52

+0

MOREOVER,請注意,並非我所有的數據庫的表都包含相同的屬性,有人擁有「property1 - property2」,其他只能擁有「property1」接口實現將失敗。 – Bit 2011-03-31 12:24:13

+0

在這種情況下,祝你好運。如果你想通用的方法,你需要一些基礎接口或類來開始。您使用反射提出的解決方案可能是性能殺手,並且是在代碼審查之後得到一些非常糟糕的反饋的最佳方式。不要懶惰,如果你有多個不同的屬性集,你應該有多個方法。 – 2011-03-31 19:28:42

0

是啊,我只是想要一個通用的方法,同樣我實現了數據集和datatable ..但它似乎不可能實現..

..ehmm..however,讓我告訴宥下面的代碼片段,動態關鍵詞看起來像是以希望....也許我colse來解決..?

public ObjectSet<dynamic> Retrieve(string entity, string context) 
    { 
     Type myObjectContextType = Type.GetType(context);    
     ConstructorInfo cs = myObjectContextType .GetConstructor(new Type[] { }); 
     dynamic myObjContext = cs.Invoke(new object[] { }); 

     Type t = Type.GetType(entity); 
     ConstructorInfo xi = t.GetConstructor(new Type[] { }); 
     dynamic UserEntity = xi.Invoke(new object[] { }); 

     !problem here! 
     ObjectSet<?????> os = myObjContext.UserEntity.Where(...) 

     return ...   

    } 

我很surprised..EF是一個偉大的工具,以更下發展的方式有效,但太少「generalizalbe」

相關問題