我不确定这个问题的确切技术规范对我来说,但简单地说,我正在尝试创建一个包装器/扩展方法来保存我的实体。
所以我在我的项目中添加了新的实体数据模型 (.edmx) 文件。像这样生成 DbSet(s)-
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
继承的。
我不建议添加继承或修改自动生成的类。
使用部分类的功能:
您可以使用界面为您的模型创建部分类。
public partial class Gallery : IEntity
{
//This is your class different than auto generated class by Ef.
}
你也不应该使用 try catch 来做决定。这就是为什么你应该分开更新和创建并在上层做出决定(没有 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();
}
}
关于c# - EntityObject 到 DbContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36266890/