【问题标题】:EntityObject to DbContextEntityObject 到 DbContext
【发布时间】:2016-07-15 23:32:27
【问题描述】:

我不确定这个问题的确切技术规范,但简而言之,我正在尝试创建一个包装器/扩展方法来保存我的实体。

所以我在我的项目中添加了新的实体数据模型 (.edmx) 文件。这会生成像这样的 DbSet-

 public partial class SUContextContainer : DbContext
    {
        public SUContextContainer()
            : base("name=SUContextContainer")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Category> Categories { get; set; }
        public DbSet<Gallery> Galleries { get; set; }
        public DbSet<SuperUser> SuperUsers { get; set; }
        public DbSet<UserType> UserTypes { get; set; }
    }

现在我试图将其包装到数据库操作的扩展方法中,例如(保存、删除、更新等)

我尝试将其创建为 -

 public static void Save(this EntityObject objEntity)
        {
            try                                                         // Update Record
            {
                ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Modified);
                Global.Context.SaveChanges();
            }
            catch (OptimisticConcurrencyException)                      // Insert Record
            {
                ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Added);
                Global.Context.SaveChanges();
            }
        }

此方法附加到 EntityObject 类型。它生成的 .edmx 代码属于 DbContext 类型。

因此,每当我尝试使用此辅助方法保存某个实体时,它永远不会发现。

 var galleryEntity = new Gallery {
       IsActive = true,
       CategoryId = model.CategoryId,
     };
  galleryEntity.Save(); // the save method is not found. 

我尝试了上面的方法来改变 -

 public static void Save(this DbSet objEntity)

但这似乎也不作为扩展方法。 我做错了什么。

【问题讨论】:

  • Gallery 是否继承自 EntityObject,您是否在源文件中添加了 using 语句?
  • @GlenThomas,不,它不继承自 EntityObject。我已经使用源文件添加了。让我在一分钟内添加源代码。
  • 看来您使用的是全局(静态)上下文。不建议这样做。此外,这种扩展方法没有意义。不管它做什么,它从不只保存EntityObject。它保存不是Unchanged每个 附加实体。另外,我不明白您为什么输入DbSet,然后期望执行EntityObject 的扩展方法。

标签: c# asp.net-mvc entity-framework extension-methods


【解决方案1】:

所以每当我尝试用这个辅助方法保存一些实体时,它永远不会 发现。

不会,因为gallery只是一个类,不是从EntityObject继承的。

我不建议添加继承或修改自动生成的类。

使用部分类的力量:

您可以使用接口为模型创建局部类。

public partial class Gallery : IEntity
{
    //This is your class different than auto generated class by Ef.
}

你也不应该使用 try catch 来做决定。这就是为什么你应该单独更新和创建并在上层做出决定(没有尝试捕获)。

所以你的扩展方法应该是这样的。

public static int Update<T>(this T entity) where T : IEntity
{
    using(var dbContext=new SUContextContainer())
    {
      var entry = dbContext.Entry(entity);
      dbContext.Set<T>().Attach(entity);
      entry.State = EntityState.Modified;
      return dbContext.SaveChanges();
    }
}

public static int Create<T>(this T entity) where T : IEntity
{
    using(var dbContext=new SUContextContainer())
    {
      dbContext.Set<T>().Add(entity);
      return dbContext.SaveChanges();
    }
}

【讨论】:

    【解决方案2】:

    您的扩展方法将仅适用于从 EntityObject 继承的类型。 您需要让所有实体类都继承自该 EntityObject 类,或者创建另一个适用于正确类型的扩展方法。

    通常在使用这些持久性模式时,您会创建一个实体基类

    public class Entity
    {
        public int Id { get; set; }
    }
    

    每个实体类型都继承自它

    public class Gallery : Entity
    {
        public int Name { get; set; }
    }
    

    然后您可以拥有跨实体类型使用的通用方法:

    public static void Save(this Entity entity);
    

    【讨论】:

    • 你确实是对的。我需要设置它,然后再自定义。请问有什么例子吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2012-02-07
    相关资源
    最近更新 更多