我正在使用實體框架和代碼。這裏有一個簡單的例子來向你展示我的情況。使用Linq表達式在通用存儲庫中執行搜索
public class PersonEfModel
{
public int Id { get; set; }
public string Vorname { get; set; }
public string Nachname { get; set; }
}
public class EfContext : DbContext
{
public DbSet<Person> Personen { get; set; }
}
要獨立於數據訪問的實現我寫了一個包含存儲庫的抽象層。
public class Person
{
public int Id { get; set; }
public string Vorname { get; set; }
public string Nachname { get; set; }
}
public interface IGenericRepository<T>
{
int Count { get; }
void Add(T item);
void Delete(T item);
void Update(T item);
T GetData(int id);
IEnumerable<T> GetData();
IEnumerable<T> GetData(int offset, int count);
IEnumerable<T> Find(Expression<Func<T,bool>> predicate);
IEnumerable<T> Find(IEnumerable<Expression<Func<T, bool>>> predicates);
}
Person
和PersonEfModel
必須是兩種不同類型,以從數據庫模型完全獨立的。所以會有一個Person類型的通用Repository,但我真的不知道如何實現Find方法。我只能對依賴於PersonEfModel而不是Person的數據庫執行表達式。
那麼有沒有辦法將Expression<Func<Person, bool>>
轉換爲Expression<Func<PersonEfModel, bool>>
來對數據庫執行它還是我在錯誤的路徑上?
您不需要創建2個對象來表示相同的實體。目前'Person'沒有底層數據訪問的概念 - 它已經獨立於數據庫模型。 – qujck 2013-03-24 22:32:15
你實際面臨什麼問題?你嘗試過什麼嗎?如果是這樣,你可以分享一些代碼嗎? – ecampver 2013-03-25 04:42:00
當你用EntityFrameworkContext加載一個實體,然後進行一些像Person.Name =「Test」這樣的更改時,看起來比下一次在上下文中調用SaveChanges人員名稱是「Test」時要好,因此實體框架正在跟蹤每個加載實體的更改。我實際上嘗試了一些東西(通過表達式樹和類似的東西),但沒有按預期工作。 – 2013-03-25 14:06:00