EntityObject 到 DbContext
EntityObject to DbContext
我不确定这个问题的确切技术规范,但简单来说,我正在尝试创建一个 wrapper/extension 方法来保存我的实体。
所以我向我的项目添加了新的实体数据模型 (.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)
但这似乎也不能作为扩展方法。
我做错了什么。
您的扩展方法将仅适用于从 EntityObject 继承的类型。
您需要使所有实体 class 继承自此 EntityObject class 或创建另一个适用于正确类型的扩展方法。
通常在使用这些类型的持久化模式时,您会创建一个实体库 class
public class Entity
{
public int Id { get; set; }
}
并且每个实体类型都继承自它
public class Gallery : Entity
{
public int Name { get; set; }
}
然后您可以拥有跨实体类型使用的通用方法:
public static void Save(this Entity entity);
So Whenever I try to save some entity with this helper method it never
finds out.
不会,因为画廊只是一个 class,不是从 EntityObject
继承的。
我不建议添加继承或修改自动生成的 classes。
使用部分classes的力量:
您可以为带有界面的模型创建空间 classess。
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();
}
}
我不确定这个问题的确切技术规范,但简单来说,我正在尝试创建一个 wrapper/extension 方法来保存我的实体。
所以我向我的项目添加了新的实体数据模型 (.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)
但这似乎也不能作为扩展方法。 我做错了什么。
您的扩展方法将仅适用于从 EntityObject 继承的类型。 您需要使所有实体 class 继承自此 EntityObject class 或创建另一个适用于正确类型的扩展方法。
通常在使用这些类型的持久化模式时,您会创建一个实体库 class
public class Entity
{
public int Id { get; set; }
}
并且每个实体类型都继承自它
public class Gallery : Entity
{
public int Name { get; set; }
}
然后您可以拥有跨实体类型使用的通用方法:
public static void Save(this Entity entity);
So Whenever I try to save some entity with this helper method it never finds out.
不会,因为画廊只是一个 class,不是从 EntityObject
继承的。
我不建议添加继承或修改自动生成的 classes。
使用部分classes的力量:
您可以为带有界面的模型创建空间 classess。
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();
}
}