EF 多对的多关系怎么修改

EF 多对的多关系怎么修改,第1张

关于EF4.0中多对多关系添加与修改的解决方案(MVC)

http://blog.csdn.net/weizengxun/article/details/6954482

实例教程,参考下吧。

@model MvcRelationShipTest.Models.News

@{

ViewBag.Title = "Edit"

}

<h2>

Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm())

{

@Html.ValidationSummary(true)

<fieldset>

<legend>News</legend>

@Html.HiddenFor(model =>model.Id)

<div class="editor-label">

@Html.LabelFor(model =>model.Title)

</div>

<div class="editor-field">

@Html.EditorFor(model =>model.Title)

@Html.ValidationMessageFor(model =>model.Title)

</div>

<div class="editor-label">

@Html.LabelFor(model =>model.Content)

</div>

<div class="editor-field">

@Html.EditorFor(model =>model.Content)

@Html.ValidationMessageFor(model =>model.Content)

</div>

<div class="editor-label">

@Html.LabelFor(model =>model.AddTime)

</div>

<div class="editor-field">

@Html.EditorFor(model =>model.AddTime)

@Html.ValidationMessageFor(model =>model.AddTime)

</div>

<div class="editor-label">

@Html.Label("分类")

</div>

<div class="editor-field">

<ul>

@*绑定分类,如果是以选择的 则加载时让他的状态为checked*@

@{List<MvcRelationShipTest.Models.Categories>list = (ViewBag.Categories as List<MvcRelationShipTest.Models.Categories>)

foreach (var item in list)

{

<li>

<label for="@item.Id">@item.Name</label>

@if (Model.Categories.Contains(item))

{

<input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id" checked="checked" />

}

else

{

<input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id" />

}

</li>

}

}

</ul>

@*Action("ChcekList", "Categories")*@

</div>

<p>

<input type="submit" value="Save" />

</p>

</fieldset>

}

<div>

@Html.ActionLink("Back to List", "Index")

</div>

以常见的权限关系来说,User\Role 2个实体是多对多关系,其POCO类似:

View Code

创建服务类似:

ServiceResult UpdateUser(User user)

这时候,我们知道,如果WCF与EF结合使用,有一些注意点:一,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系统!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11805765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存