我不确定这个问题的确切技术规范对我来说,但简单来说,我试图创建一个包装/扩展方法来保存我的实体。
所以我在项目中添加了新的实体数据模型(.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)
但这似乎也不作为扩展方法。 我做错了什么。
答案 0 :(得分:1)
您的扩展方法仅适用于从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);
答案 1 :(得分:1)
所以每当我尝试用这个帮助方法保存一些实体时,它永远不会 发现了。
它不会,因为gallery只是一个类而不是从EntityObject
继承。
我不建议添加继承或修改自动生成的类。
使用部分类的力量:
您可以使用界面为模型创建patial classess。
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();
}
}