从Entity中获取DbContext

时间:2013-09-08 20:17:28

标签: .net entity-framework

在我的项目中,我经常没有单独的数据访问层,但出于性能原因,我想向我的实体添加一些原始SQL方法。

所以我在我的一个Entity类中有一个MassUpdateSomethingAndPersist()。要进行批量更新,我需要从实体内部调用dbContext.Database.ExecuteSqlCommand。但是我当然需要首先引用DbContext。

问题

是否可以从实体中获取DbContext?使用反射对我来说不是问题,因为无论如何这些都是相对繁重的操作。

3 个答案:

答案 0 :(得分:3)

我认为你要做的事情表明了OO的设计缺陷。更新数据库不应该是实体类的责任。这是DBContext的责任。

所以

  1. 不,这是不可能的,
  2. 想要这样做,表明存在设计缺陷(可能)
  3. 如果要执行自定义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