在我的项目中,我经常没有单独的数据访问层,但出于性能原因,我想向我的实体添加一些原始SQL方法。
所以我在我的一个Entity类中有一个MassUpdateSomethingAndPersist()。要进行批量更新,我需要从实体内部调用dbContext.Database.ExecuteSqlCommand
。但是我当然需要首先引用DbContext。
问题
是否可以从实体中获取DbContext?使用反射对我来说不是问题,因为无论如何这些都是相对繁重的操作。
答案 0 :(得分:3)
我认为你要做的事情表明了OO的设计缺陷。更新数据库不应该是实体类的责任。这是DBContext
的责任。
所以
如果要执行自定义SQL,则应在调用者上,在上下文中执行,而不是从实体本身执行。
可在此处找到一个示例:DBContext Native SQL Queries。
答案 1 :(得分:1)
有可能:
((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, e) =>
{
(e.Entity as IEntityWithDbContext).DbContext = dbContext;
}
public interface IEntityWithDbContext
{
public DbContext DbContext { get; set; }
}
public partial class User : IEntityWithDbContext
{
public IEntityWithDbContext.DbContext DbContext { get; set; }
}
但它仍然是一个设计缺陷......
根据您的描述,您应该能够轻松地使MassUpdateSomethingAndPersist()
成为DbContext的方法(即MassUpdateSomethingAndPersist(something)
)。
答案 2 :(得分:0)
在Entity Framework中,您应该遵循实体的域驱动设计(DDD)概念,即它总是 persistence ignorant 。如果你按照要求打破这种模式,那么你可能会发现进行适当的单元测试非常困难。
对象在数据库中修改自己的表示形式的模式称为the Active Record Pattern,并不是实体框架所鼓励的。如果您想使用Active Record Pattern,那么请查看专为此设计的框架 - 例如Castle ActiveRecord。