同时删除和添加EF多个关系 [英] Simultaneous Delete and Add in EF Many-Many relationship

查看:65
本文介绍了同时删除和添加EF多个关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

伙计们,


 


我在我们的项目中使用ASP.net MVC 2和EF 4。


 


我有一个要求数据... 


我必须更新类型的实体与添加和删除ProgramManager(另一个实体)的合同和我shud更新实体合同。


 


我尝试使用以下代码。


 



if(editContract.ProgMgrs!= null&& editContract。 ProgMgrs.Count()> 0)


                     {


 


                         var contract = container.Contracts.Single(c => c.Id == editContract.Contract.Id);


                         var contractProgMgrs = contract


                             .ProgramManagerUsers.Select


                                (p => p.Id);


 


                         var commonProgMgrs = editContract.ProgMgrs.Intersect(contractProgMgrs);


                         var removableProgMgrs = commonProgMgrs!= null? contractProgMgrs.Where(c => commonProgMgrs.Any(p => p!= c)):contractProgMgrs;


                         var additionalProgMgrs = commonProgMgrs!= null?   editContract.ProgMgrs.Where(e => commonProgMgrs.Any(p => p!= e)):
editContract.ProgMgrs ;


 


                         // var contractProgMgrs = editContract.Contract.ProgramManagerUsers.Select(p => p.Id).ToList();


                         // var existedProgMgrs = container.Users.Where(u => contractProgMgrs.Any(p => p == u.Id))。ToList();


  ;                        foreach(removeProgMgrs中的var contractProgMgr)


                         {


                             var user = container.Users.Single(u => u.Id == contractProgMgr);


                             editContract.Contract.ProgramManagerUsers.Remove(user);


                             container.ObjectStateManager.ChangeObjectState(user,EntityState.Deleted);


                             // user.Contracts.Remove(editContract.Contract);


                             // editContract.Contract.ProgramManagerUsers.Remove(contractProgMgr);


                        }


 


                         foreach(additionalProgMgrs中的var contractProgMgr)


                         {


                             var user = container.Users.Single(u => u.Id == contractProgMgr);


                             editContract.Contract.ProgramManagerUsers.Add(user);


                             container.ObjectStateManager.ChangeObjectState(user,EntityState.Added);


                             // user.Contracts.Add(editContract.Contract);


                             // editContract.Contract.ProgramManagerUsers.Remove(contractProgMgr);


                        }


 


                         // var newProgMgrs = container.Users.Where(u => editContract.ProgMgrs.Any(p => p == u.Id))。ToList();


                         // foreach(newProgMgrs中的var progMgr)


                         // {


                         //    editContract.Contract.ProgramManagerUsers.Add(progMgr);


                         //    // contract.ProgramManagerUsers.Add(progMgr);


 


                         //}


                    }


 


                     container.ObjectStateManager.ChangeObjectState(editContract.Contract,EntityState.Modified);


                     container.SaveChanges();



 


其中'editContract'是我的具有合同类型的合同的模型。


 


我希望你能在这方面帮助我。


提前感谢。


 


 


 

解决方案

Hello KishRockz,


 


欢迎到MSDN论坛。


根据您对问题的描述,您的代码是否正常工作?如果没有,这是来自实体框架专家Julie Lerman的博客文章。它讨论了在实体框架中使用Join实体插入多对多关系而没有Join
实体。


这是链接:
http://thedatafarm.com/blog/数据访问/插入 - 多对多关系 - 在 - 或 - 没有 - 加入 - 实体/


关于删除,你可以附上()实体 然后删除()它。见:


http://efreedom.com/Question/1-757067/Delete-Many-Many-Relationship-Entity-Framework-Without-Loadingurismo


我希望您可以帮助您,如果您有任何疑问,请随时告诉我们。


 


祝您有愉快的一天,


folks,

 

I m using ASP.net MVC 2 and EF 4 in our proj.

 

I have a requirement dat ... 

I have to update an Entity of type Contract with adding and removing ProgramManager(another entity)s and I shud update the entity Contract .

 

I tried this using the following Code.

 

if (editContract.ProgMgrs != null && editContract.ProgMgrs.Count() > 0)

                    {

 

                        var contract = container.Contracts.Single(c => c.Id == editContract.Contract.Id);

                        var contractProgMgrs = contract

                            .ProgramManagerUsers.Select

                                (p => p.Id);

 

                        var commonProgMgrs = editContract.ProgMgrs.Intersect(contractProgMgrs);

                        var removableProgMgrs = commonProgMgrs != null ? contractProgMgrs.Where(c => commonProgMgrs.Any(p => p != c)) : contractProgMgrs;

                        var additionalProgMgrs = commonProgMgrs != null ?  editContract.ProgMgrs.Where(e => commonProgMgrs.Any(p => p != e)): editContract.ProgMgrs;

 

                        //var contractProgMgrs = editContract.Contract.ProgramManagerUsers.Select(p => p.Id).ToList();

                        //var existedProgMgrs = container.Users.Where(u => contractProgMgrs.Any(p => p == u.Id)).ToList();

                        foreach (var contractProgMgr in removableProgMgrs)

                        {

                            var user = container.Users.Single(u => u.Id == contractProgMgr);

                            editContract.Contract.ProgramManagerUsers.Remove(user);

                            container.ObjectStateManager.ChangeObjectState(user, EntityState.Deleted);

                            //user.Contracts.Remove(editContract.Contract);

                            //editContract.Contract.ProgramManagerUsers.Remove(contractProgMgr);

                        }

 

                        foreach (var contractProgMgr in additionalProgMgrs)

                        {

                            var user = container.Users.Single(u => u.Id == contractProgMgr);

                            editContract.Contract.ProgramManagerUsers.Add(user);

                            container.ObjectStateManager.ChangeObjectState(user, EntityState.Added);

                            //user.Contracts.Add(editContract.Contract);

                            //editContract.Contract.ProgramManagerUsers.Remove(contractProgMgr);

                        }

 

                        //var newProgMgrs = container.Users.Where(u => editContract.ProgMgrs.Any(p => p == u.Id)).ToList();

                        //foreach (var progMgr in newProgMgrs)

                        //{

                        //    editContract.Contract.ProgramManagerUsers.Add(progMgr);

                        //    //contract.ProgramManagerUsers.Add(progMgr);

 

                        //}

                    }

 

                    container.ObjectStateManager.ChangeObjectState(editContract.Contract, EntityState.Modified);

                    container.SaveChanges();

 

in which 'editContract' is my model that has a property Contract of type Contract.

 

I hope u can help me in this regard.

thanks in advance.

 

 

 

解决方案

Hello KishRockz,

 

Welcome to the MSDN Forum.

According to your description about your issue, does your code work fine? If not, here is a blog article from an expert in Entity Framework, Julie Lerman. It talks about insert many to many relationship in Entity Framework with Join entity and without Join entity.

Here is the link: http://thedatafarm.com/blog/data-access/inserting-many-to-many-relationships-in-ef-with-or-without-a-join-entity/

About deleting, You can Attach() an entity then Remove() it. See this:

http://efreedom.com/Question/1-757067/Delete-Many-Many-Relationship-Entity-Framework-Without-Loading-Data

I hope you can help you, If you have any questions please feel free to let us know.

 

Have a nice day,


这篇关于同时删除和添加EF多个关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆