我刚刚进入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();
}
}
或者是否有更好的方法将用户与作业相关联?
答案 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");
}
...
}