EF断开连接或者分布式应用无法自跟踪实体状态如何解决的?

cnwin cnwin 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
刚刚学习EF不久,有些问题还不懂,自己摸索。

问题是这样,如果数据层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();
}
}

这样倒是能解决了问题,但不知这样是否是正确的方式?
...全文
评论 4
收藏 已收藏
分享
返回顶部
cnwin
C# 111,129 成员 642,538 内容