嗯,你是在正確的軌道上已有,只需要實現你說什麼,你想:)
1.You're傳遞一個表達式到您的查找方法,只需使用在表達你在哪裏第
2.You只需從你的DbContext對查詢得到正確的DbSet,擁有的DbContext的方法來獲得給定類型的的DbContext,使用並可以查詢像
public IQueryable<T> Find<T>(Expression<Func<T, bool>> query) where T : IMyDomainEntity
{
var dbSet = context.Set<T>();
return dbSet.Where(query);
}
3 。如果你的域對象是不是EF映射到數據庫中的,你需要定製針對什麼在你的數據庫在你的DbContext類(無需automapper爲)你的映射,所以你會有這樣的事情你的DbContext類
public class MyContext : DbContext
{
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Map(a => a.ToTable("DB_USERS"))
.Property(a => a.Email).HasColumnName("MAIL");
base.OnModelCreating(modelBuilder);
}
}
要在DB到類用戶表DB_USERS地圖,具有領域不同的名字,等這裏的一對是
http://www.codeproject.com/Articles/165720/Using-the-Code-First-Model-Configuration-Classes
您也可以映射的文章如果您不想/不能更改您的DbCon,則使用屬性將屬性添加到正確的表列文本類
http://msdn.microsoft.com/en-us/data/gg193958
或者你可以有一組不同的映射到你的數據庫,並使用automapper將其轉化爲你的域對象的實體,但你不失時機。因爲您需要實現查詢以將其自動映射到您的域模型。
4.No需要做什麼特別的事情,EF照顧的是
UPDATE:解決方案,而無需到的DbContext(不完全仿製藥,但作品)
的想法是訪問爲每個域類創建存儲庫的映射部分,這樣所有的都可以正確綁定。與User
域模型和DBUser
表格模型在繼續:
public class User : IDomainModelEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public class DBUser
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int USER_ID { get; set; }
[Required]
[MaxLength(150)]
public string USER_NAME { get; set; }
[Required]
[MaxLength(260)]
public string USER_MAIL { get; set; }
}
那麼你將有一個抽象庫,每個域類的一個具體的存儲庫實現映射的基本GETALL查詢:
public abstract class Repository<T> where T : IDomainModelEntity
{
protected readonly DbContext _context;
public Repository(DbContext context)
{
_context = context;
}
public abstract IQueryable<T> GetAll();
public IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
return GetAll().Where(predicate);
}
}
public class UserRepository : Repository<User>
{
public UserRepository(DbContext context)
: base(context)
{
}
public override IQueryable<User> GetAll()
{
return _context.Set<DBUser>()
.Select(u => new User
{
Id = u.USER_ID,
Name = u.USER_NAME,
Email = u.USER_MAIL
});
}
}
現在使用它,你將只需要調用查找或讓所有的倉庫......
using (var context = new CompanyDbContext())
{
var repo = new UserRepository(context);
var list = repo.Find(a=>a.Id >= 2).ToList();
list.ForEach(a => Console.WriteLine("Id: {0}, Name {1}, email {2}", a.Id, a.Name, a.Email));
}
這不是因爲喲完全通用ü將需要傳遞一個信息庫,你需要使用的每個域類,但它可能是一個可以接受的妥協
希望這有助於
溝EF和使用NHibernate的或RavenDb。 (OMG ..是否有人只是建議?! WIN!) –
我和你在一起,但公司不是。我能做的最接近的事情就是與公司溝通。 –