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

本文介绍了在使用Entity Framework 4.0进行MVC开发时,如何处理多对多关系的添加与修改。通过创建新闻表News、分类表Categories和关系表NewsInCategories,演示了在数据库中预填分类后,如何在前端页面添加新闻并关联分类。
摘要由CSDN通过智能技术生成

首先在此声明一下,我不是这方面的高手,也是一个初学者,如果文章中出现不对的地方还请诸位多多指正。
进入正题。
首先我们在数据库中建三个表
新闻表:News
分类表:Categories
新闻与分类的关系表:NewsInCategories
关系如下:


先在数据库中预先添加几个分类:
现在开始添加新闻:
以下是页面代码:

@model MvcRelationShipTest.Models.News
@{
    ViewBag.Title = "Create";
}
<h2>
    Create</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>
        <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.TextBox("AddTime", DateTime.Now)
            @Html.ValidationMessageFor(model => model.AddTime)
        </div>
        <div class="editor-label">
            @Html.Label("分类")
        </div>
        <div class="editor-field">
            @*Html.CheckBoxFor(Model => Model.Categories)*@
            @{Html.RenderAction("ChcekList", "Categories");}
        </div>
        <p>
            <input type="submit" value="添加" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>


CheckList的View:

@model IEnumerable<MvcRelationShipTest.Models.Categories>
<ul>
    @foreach (var item in Model)
    {
        <li>
            <label for="@item.Id">@item.Name</label>
            <input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id"/>
        </li>        
    }
</ul>

添加页面没什么特别的。

News的Control部分:

        //GET
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Models.News model)
        {

            try
            {
                var t = Request["CategoryId"];//获取选中的分类ID格式为("1,2,3”)不包含括号。
                using (var db = new dbContent())
                {
                    if (t != null)
                    {
                        List<Int32> idlist = StringToIntList(t);//将传来的分类ID转成List<int>
                        var cate = db.Categories.Where(p => idlist.Contains(p.Id));
                        foreach (var item in cate)
                        {
                            model.Categories.Add(item);//给新闻添加分类
                        }
                    }
                    db.News.AddObject(model);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                var y = ex.InnerException;
                return View(model);
            }

        }


以上是添加新闻的页面代码。
现在修改新闻
Edit View的代码:

@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>


Controller部分的代码:

public ActionResult Edit(int id)
        {
            var db = new dbContent();
            ViewBag.Categories = db.Categories.ToList();

            var model = db.News.Where(n => n.Id == id).FirstOrDefault();
            return View(model);
        }

        [HttpPost]
        public ActionResult Edit(int id, Models.News model)
        {
            try
            {
                model.Id = id;
                var t = Request["CategoryId"];
                using (var db = new dbContent())
                {
                    if (t != null)
                    {
                        List<Int32> idlist = StringToIntList(t);
                        //新的分类
                        var cate = db.Categories.Where(p => idlist.Contains(p.Id)).ToList();
                        //原来的分类
                        var olist = model.Categories.AsQueryable();
                        //要删除的分类
                        var dlist = olist.Where(p => !cate.Contains(p)).ToList();
                        //要添加的分类
                        var alist = cate.Where(p => !olist.Contains(p)).ToList();
                        foreach (var item in dlist)
                        {
                            model.Categories.Remove(item);
                        }
                        foreach (var item in alist)
                        {
                            model.Categories.Add(item);
                        }
                    }
                    else
                    {
                        model.Categories.Clear();
                    }

                    db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified);
                    db.SaveChanges();
                }
                return RedirectToAction("index");
            }
            catch (Exception ex)
            {
                var t = ex.InnerException;
                var db = new dbContent();
                ViewBag.Categories = db.Categories.ToList();
                return View(model);
            }
        }

好了,修改也完成了。
现在分析一下,其实最关键的就是你要把你选择的分类ID以("1,2,3,4,5,9")的方式传到后台。
后台在根据这个分类ID获取分类,然后添加到新闻中,跟web的处理有点类似。
看一下最后的成果,嘻嘻!


想要demo的朋友请加QQ群:63181865索取。
到此结束。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值