我不确定这个问题的确切技术规范,但简单地说,我正试图创建一个包装/扩展方法来保存我的实体。
因此,我向我的项目添加了新的实体数据模型(.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)但这似乎也不作为扩展方法。我做错什么了。
发布于 2016-03-28 17:45:15
因此,每当我试图用此助手方法保存某个实体时,它都不会发现。
它不会,因为库只是一个类,并不是从EntityObject继承的。
我不建议添加继承或修改自动生成的类。
使用部分类的能力:
您可以通过界面为您的模型创建patial类。
public partial class Gallery : IEntity
{
//This is your class different than auto generated class by Ef.
}另外,你也不应该用尝试捕捉来做决定。这就是为什么您应该分离、更新、创建并在上层做出决定(不要尝试捕捉)。
所以你的扩展方法应该是这样的。
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();
}
}发布于 2016-03-28 17:12:27
扩展方法只适用于从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);https://stackoverflow.com/questions/36266890
复制相似问题