asp.net-mvc – 有没有更好的方法来使用MVC 4和Entity Framework
我正在学习MVC并结合Entity Framework处理其无状态特性.我的问题是,是否有更优雅的方式来处理下面的场景?
我有两个POCO实体: public class Contest { public long ID { get; set; } .... ..... public ICollection<ContestPrize> Prizes { get; set; } } public class ContestPrize { public long ID { get; set; } public Contest Contest { get; set; } } 然后我有一个MVC视图,显示比赛和与之相关的所有奖品.在该视图中,我有一个“创建奖”链接来创建一个新的奖品,将比赛的ID传递给ContestPrize控制器,如下所示: @Html.ActionLink("Create Prize","Create","ContestPrizes",new { ContestId = Model.ID },null) ContestId作为隐藏字段保留在提交新奖项的表单中,以便我可以在创建时检索它.奖品控制器上的创建方法如下: [HttpPost] public ActionResult Create(int ParentID,ContestPrize ContestPrize) { if (ModelState.IsValid) { db.ContestPrizes.Add(ContestPrize); db.SaveChanges(); return RedirectToAction("Index","Contests",ParentID); } return View(ContestPrize); } 这是我遇到一些我不喜欢的丑陋的地方.以下是问题: > ModelState.IsValid测试失败.这是因为父模型的导航属性为null.它还没有填充.我可以跳过模型上的验证并直接进入数据库,但有没有办法填充这个而不做下面的#2? 那么,实体框架是否有办法只设置父项的ID并保存子项而不必检索父对象?或者……理想情况下,有一种方法可以使用MVC在创建时使用父对象预填充新模型,因为在进入创建视图之前我确实有父对象吗?传递ViewData中的父对象可能有多糟糕? 我可以通过重新加载父项来完成这项工作.但是如果可能的话我想避免它. 思考? 更新:将ContestID添加到ContestPrize POCO,然后使用[ForeignKey(“ContestID”)]装饰导航属性,因为@NSGaga建议完美无缺,并消除了一些麻烦的ParentID传递问题.新的POCO看起来像这样: public class Contest { public long ID { get; set; } .... ..... public ICollection<ContestPrize> Prizes { get; set; } } public class ContestPrize { public long ID { get; set; } public long ContestID { get; set; } [ForeignKey("ContestID")] public Contest Contest { get; set; } } 我可以消除传递的ParentID并将其作为隐藏字段设置在视图中,因为MVC中的数据绑定会处理新实体上的ContestID(我仍然必须将id传递给初始视图,但这就是全部.它是刚从那里开出来). Controller上的新Create操作如下所示: [HttpPost] public ActionResult Create(ContestPrize ContestPrize) { if (ModelState.IsValid) { db.ContestPrizes.Add(ContestPrize); db.SaveChanges(); return RedirectToAction("Index",ContestPrize.ContestID); } return View(ContestPrize); } 干净简单,没有乱七八糟.我喜欢. 解决方法
如果您正在使用’代码优先'(所有建议),那么您可以做类似……
public class ContestPrize { public long ID { get; set; } public long ContestID { get; set; } public Contest Contest { get; set; } } 这应该创建(按惯例)并将ContestID映射到FK.在某些复杂的情况下,您可能需要在流畅的代码中指定该关系,但这通常就足够了.
这是粗暴的,如果您需要更多信息,请告诉我. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何用asp.net页面提供javascript?
- .net-core – 如何在Asp.net核心中使用Akka.Net 1.3.0配置的
- asp.net – 如何向DropDownList添加初始“select”值
- asp.net-mvc – MVC 3 – 仅限特定用户访问
- asp.net-mvc – 在.NET MVC应用程序中“深入挖掘”角色的距
- ASP.NET EF错误:11007未映射实体类型
- asp.net-mvc-3 – MVC3 – 使用Entity框架设置Controller时
- asp.net-mvc – 传统的ASP.NET Web窗体与MVC
- asp.net-mvc-3 – mvc3 jquery unobtrusive验证语言环境十进
- 在Asp.net中加载平衡,在开发时我应该考虑什么?
- 以编程方式获取当前的ASP.NET信任级别
- asp.net-mvc-2 – 什么是Html.Validate和Html.Va
- FormsAuthenticationModule使用ASP.NET MVC验证事
- asp.net-mvc – ValidationMessage – 处理同一属
- asp.net-mvc – StackExchange.Redis.IDatabase存
- asp.net viewstate加密问题
- asp.net – 动画gif不动画提交
- asp.net-mvc – 从WebAPI生成MVC控制器操作的路由
- asp.net – 使用类库从web.config / app.config获
- asp.net-core-mvc – ASP.NET MVC6 Beta8和Windo