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

cnwin 2019-06-14 10:23:26
刚刚学习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();
}
}

这样倒是能解决了问题,但不知这样是否是正确的方式?
...全文
246 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnwin 2019-06-23
  • 打赏
  • 举报
回复
用Remoting做分布式应用测试了,客户端获取的实体,修改后回传,状态却是Detached。无论怎样的操作,回传的都是Detached,应该是没有跟踪到了。如何解决呢?
cnwin 2019-06-23
  • 打赏
  • 举报
回复
目前看来,回传后在dal层检查该实体是否存在,存在则将查找出的实体数据更改为回传的,否则新增。只能先用这种办法解决了。
正怒月神 2019-06-14
  • 打赏
  • 举报
回复
1 首先 DbContext 千万不能单例。不能单例,不能单例。。。。 你可以尝试单例后,2个人登录网页操作的结果。 2 因为Using方式,使用完就关闭了。。。。 直接new出来,不用using
cnwin 2019-06-14
  • 打赏
  • 举报
回复
嗯,new对象确实可以,但不知在分布式应用中是否也能跟踪到状态呢?例如用remoting做分布式应用.

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧