在创建类MVC 4的新实例时创建相关属性 - 实体框架

时间:2013-04-02 16:22:24

标签: asp.net-mvc entity-framework

我刚刚进入MVC 4和Entity Framework 5,想知道我在做什么是正确的?

我有一个UserObject和一个JobObject,jobObject有一个用户对象的引用。

public class Job
{
    public int id { get; set; }
    public virtual MyUser User { get; set; }
    public JobType JobType { get; set; }
}

当我想创建Job的实例时,我在查询字符串中传递一个参数UserID,但Job只处理MyUser的一个实例。

以下是将用户与作业相关联的正确方法吗?

[HttpPost]
public ActionResult Create(Job job, int userid)
{
   if (ModelState.IsValid)
   {    
     MyUser staffmember = db.MyUsers.Find(userid);
     if (staffmember == null)
      {
        return View("StaffMemberNotFound");
      }
     job.User = staffmember;
     db.Jobs.Add(job);
     db.SaveChanges(); 
   }
}

或者是否有更好的方法将用户与作业相关联?

2 个答案:

答案 0 :(得分:1)

你的方式会起作用,但如果可能,我更愿意使用id。

我建议您在MyUserId类中添加Job属性(如果您使用的是codefirst,请记得更新数据库):

public class Job
{
    public int id { get; set; }
    [ForeignKey("User")]
    public int MyUserId { get; set: }

    public virtual MyUser User { get; set; }
    public JobType JobType { get; set; }
}

然后只填充MyUserId。您还可以更改您的检查以简单地检查ID是否存在与寻找对象相关并让EF将其映射到类之前将其返回给您

[HttpPost]
public ActionResult Create(Job job, int userid)
{
   if (ModelState.IsValid)
   {    
     if (!db.MyUsers.Any(u => u.Id == userid)
     {
        return View("StaffMemberNotFound");
     }

     job.MyUserId = userid;
     db.Jobs.Add(job);
     db.SaveChanges(); 
   }
}

当您下次从数据库中检索记录时,EF将为您完成剩余的映射。

答案 1 :(得分:0)

您的方法运行正常,您可以进行的唯一一个小优化是不会因为MyUser staffmember = db.MyUsers.Find(userid);而获取userid的“检索点击”。

我使用的是ASP.NET MVC 4和Entity Framework 5.0,这里是我的代码(不同的模型对象,但与你正在做的事情相同)。

注意:我让EF生成我的模型类,方法是右键单击Models文件夹并在VS.NET 2012中选择Add->ADO.NET Entity Data Model

<强> Store.Models.Product

namespace Store.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Product
    {
        public long Id { get; set; }
        public string ProductName { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
        public System.DateTime DateAdded { get; set; }
        public Nullable<long> CategoryId { get; set; }

        public virtual Category Category { get; set; }
    }
}

<强> Store.Models.Category

namespace Store.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Category
    {
        public Category()
        {
            this.Products = new HashSet<Product>();
        }

        public long Id { get; set; }
        public string CategoryName { get; set; }
        public System.DateTime DateAdded { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }
}

在我的Create.cshtml页面上,我让用户从下拉列表中选择CategoryId。此类别ID绑定到Product.CategoryId。我在我的方法中做的就是:

<强> ProductController的

public class ProductController : Controller
{
    ...
    [HttpPost]
    public ActionResult Create(Product product)
    {
        product.DateAdded = DateTime.Now;
        if (dbContext != null)
        {
            dbContext.Products.Add(product);
            dbContext.SaveChanges();
        }
        return RedirectToAction("Index");
    }
    ...
}