创建模型从其他模型继承的记录

时间:2009-06-05 22:23:05

标签: asp.net-mvc entity-framework

如何正确设置模型引用属性?

我有一个名为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" });
        }

1 个答案:

答案 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会为您完成工作。