1

我刚刚进入 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; }
}

当我想创建作业的实例时,我在查询字符串中传递了一个参数 UserID,但作业只处理 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(); 
   }
}

或者有没有更好的方法将用户与工作相关联?

4

2 回答 2

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 将为您完成其余的映射。

于 2013-04-02T16:42:16.553 回答
0

您的方法效果很好,您唯一可以做的小优化就是不接受“检索命中”,MyUser staffmember = db.MyUsers.Find(userid);因为您已经拥有userid.

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

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

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。我在我的方法中所做的就是:

产品控制器

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");
    }
    ...
}
于 2013-04-02T19:11:15.457 回答