如何正确设置模型引用属性?
我有一个名为Platform的Model,它具有一个名为Service的模型的导航属性。
我遇到的问题是设置platformToCreate.Service的值。
以下是Platform表的屏幕截图:
alt text http://img268.imageshack.us/img268/6394/platform.jpg
以下是EDM的截图:
alt text http://img19.imageshack.us/img19/3664/edms.jpg
代码:
[ValidateInput(true)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "id")] Platform platformToCreate)
{
ViewData["title"] = platformToCreate.title;
ViewData["url"] = platformToCreate.url;
ViewData["platform_nm"] = platformToCreate.platform_nm;
ViewData["enabled"] = platformToCreate.enabled;
int selectedService = int.Parse(Request.Form["service_id"].ToString());
var cats = from c in db.Services select c;
ViewData["service_id"] = new SelectList(cats, "id", "name", selectedService);
if (!_service.CreatePlatform(platformToCreate))
return View(platformToCreate);
TempData["Msg"] = "Record Created";
return RedirectToRoute(new { controller = "Home" });
}
答案 0 :(得分:1)
这取决于您使用的EF版本,即使我知道哪种版本的可能性仍然是无穷无尽的。 :)我会举几个例子。
版本1.0
public void Update(User user)
{
using (var context = new ObjectContext(""))
{
user.Blog = GetBlog(user.Id);
context.ApplyPropertyChanges("User", user);
}
}
private Blog GetBlog(int userId)
{
using (var context = new ObjectContext(""))
{
return (from u in context.Users
where u.Id == userId
select u).FirstOrDefault();
}
}
在版本2和POCO中:
public class User
{
public virtual int Id { get; set; }
public virtual Blog Blog { get; set; }
public void AddEntry(Entry entry)
{
if (Blog.Entries == null)
Blog.Entries = new List<Entry>();
entry.Blog = Blog;
Blog.Entries.Add(entry);
}
}
public class Blog
{
public virtual int Id { get; set; }
public virtual IList<Entry> Entries { get; set; }
}
当然,有很多选项使用EntityKey值,加载引用等。我倾向于使用最简单的变体。
编辑:好的,你的问题。如果你对待它,MVC是非常宽容的。我将从以下内容开始:当您创建选择列表时很好:
ViewData["service_id"] = new SelectList(cats, "id", "name", selectedService);
但是要在MVC中正确使用此选择列表,您实际上可以像下面这样分配它:
<%= Html.DropDownList("Service.Id", (IEnumerable<SelectListItem>)ViewData["service_id"])%>
此处需要注意的是 Service.Id 。这意味着在下拉列表中选择的任何值都将分配给Platform.Service.Id。当您持久进行更改时,Entity Framework会为您完成工作。