首页 新闻 赞助 找找看

WCF+Entity Framework如何处理多表级联关系的增删改

0
悬赏园豆:50 [待解决问题]

一、WCF传递的需要是POCO类,且不能循环引用(这一点通过在实体类添加[DataContract(IsReference=true)]即可)

二、一个问题是EF的延迟加载和代理实例机制,导致EF查询结果并非POCO类,而是代理类,

     需要关系EF代理实例模式:Configuration.ProxyCreationEnabled = false;

如何实现UpdateUser方法呢,一般我们会用IDbSet.Attach()方法来更新

m_DbSet.Attach(entity);
            this.DbContext.Entry<T>(entity).State = EntityState.Modified;
this.DbContext.SaveChanges();

但是这时候你就会发现,由于EF为了支持WCF服务已经关闭了ProxyCreationEnabled ,所以无论如何,这里的Attach方法是不能执行成功的,

那这时候你会想,那我不采用Attach方法,先Delete实体,再重新添加行不行呢,

NO  no  no ,由于EF在SaveChanges的时候会根据实体关系,自动修改数据表,所以当你删除User时候的时候会删除User表以及User_Role表中的记录,此时再添加User实体的话,会向User表添加User,User_Role表添加关系,Role表添加Role(因为User.Roles的存在),

这时候你会发现Role表添加Role就不行了,因为记录已经存在了;所以这种方式也不能很好的解决问题!!

怎么办呢,所以来此求助各位大牛~~看看有什么经验,好的处理方法!

ps:Data Services、Ria services暂时不考虑,因为我的应用需要对具体的操作进行授权!非Web系统!

彼年豆蔻的主页 彼年豆蔻 | 初学一级 | 园豆:146
提问于:2014-08-14 16:39
< >
分享
所有回答(3)
1

把 EF 使用的实体类同 WCF 接口暴露的数据契约分开。

Launcher | 园豆:45045 (高人七级) | 2014-08-14 17:03

接手的别人的一个半成品项目,里面没有领域模型,WCF传输用的CodeFirst的实体类,修改的话可能需要大改。

在寻找有木有简单的方法~

支持(0) 反对(0) 彼年豆蔻 | 园豆:146 (初学一级) | 2014-08-14 17:11

@彼年豆蔻: 不要用 Attach:

更新实体这样:

var obj = m_DbSet.find(....);

obj.xxxx = entity.xxxx;

this.DbContext.SaveChanges();

添加新的实体:

var obj = new XXXXX;

m_DbSet.Add(obj);

this.DbContext.SaveChanges();

 

支持(1) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-08-14 17:16
0

使用这个看看,推荐使用

http://files.cnblogs.com/humble/d.pdf

迅捷网络[来送福利] | 园豆:616 (小虾三级) | 2014-08-14 20:04
0

你在外面用分布事物来做吧,你在操作的时候他自己去去处理,但事务要自己来做

望着天的蜗牛 | 园豆:354 (菜鸟二级) | 2014-08-14 20:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册