EF断开连接或者分布式应用无法自跟踪实体状态如何解决的?
刚刚学习EF不久,有些问题还不懂,自己摸索。
问题是这样,如果数据层DbContext使用单一实例(不关闭连接吧)方式,那么读取数据,更改后写回,是能跟踪到传回的数据状态的。但这种一直不关闭连接,使用单一实例的DbContext似乎是不好的吧。而且如果在分布式应用,我想也不可能一直保持着连接的。所以,获取数据改为:
而回传数据,保存代码无法通过这种方式:
因为Using方式,使用完就关闭了,所以再传回的全部是Detached,保存会提示更新条目出错......。所以改为查找实体是否有相同主键的,如果有则修改值,并更新,没有则添加:
另外删除实体我是单独一个方法,传回删除的实体,进行删除:
这样倒是能解决了问题,但不知这样是否是正确的方式?
问题是这样,如果数据层DbContext使用单一实例(不关闭连接吧)方式,那么读取数据,更改后写回,是能跟踪到传回的数据状态的。但这种一直不关闭连接,使用单一实例的DbContext似乎是不好的吧。而且如果在分布式应用,我想也不可能一直保持着连接的。所以,获取数据改为:
public static List<T> GetEntiyToList<T>(string Filter = "") where T : class
{
using (var ctx = new ERPContext())
{
return ctx.Set<T>().ToList();
}
}
而回传数据,保存代码无法通过这种方式:
public static void SaveEntity<T>(T entity) where T : class
{
var state = ctx.Entry(entity).State;
if (state == EntityState.Unchanged)
ctx.Entry(entity).State = EntityState.Modified;
else if (state == EntityState.Detached)
ctx.Set<T>().Add(entity);
}
因为Using方式,使用完就关闭了,所以再传回的全部是Detached,保存会提示更新条目出错......。所以改为查找实体是否有相同主键的,如果有则修改值,并更新,没有则添加:
public static void SaveEntity<T>(T entity) where T : class
{
using (var ctx = new ERPContext())
{
object[] keyvalue = GetKeyValues(entity);
var ExistsEntity = ctx.Set<T>().Find(keyvalue);
if (ExistsEntity == null)
{
ctx.Set<T>().Add(entity);
}
else
{
var props = ExistsEntity.GetType().GetProperties();
foreach (var p in props)
{
foreach (var p1 in props)
{
if (p1.Name == p.Name && p1.GetValue(entity) != p.GetValue(ExistsEntity))
p.SetValue(ExistsEntity, p1.GetValue(entity));
}
}
}
ctx.SaveChanges();
}
}
另外删除实体我是单独一个方法,传回删除的实体,进行删除:
public static void DeleteEntity<T>(T entity) where T : class
{
using (var ctx = new ERPContext())
{
ctx.Set<T>().Remove(entity);
ctx.SaveChanges();
}
}
这样倒是能解决了问题,但不知这样是否是正确的方式?
...全文
相关推荐
C#自动生成EF实体代码及实体Configuration代码
VS2013开发的EF实体代码生成项目,只需更改配置文件中的数据库连接字符串,启动项目就可以在web页面选择配置的数据库,选择数据表,右侧直接生成实体代码及实体Configuration映射代码
ADO.NET EF中的实体修改方法
ADO.NET EF中的实体修改方法
EF获取所有实体的映射
EF获取所有实体的映射,将实体和数据库的表名、列名的映射提取出来,并存储
EF DbContext Generator生成的实体注释的解决方案
EF DbContext Generator生成的实体注释的解决方案
asp.net 自跟踪实体模板 解决删除实体后保存不成功的问题
tt模板绝对可以用,替换掉本地的tt模板即可(文件头除外)。绝对是本人原创,所以分数有点高。


