【发布时间】: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