我来自PHP背景;现在使用 ASP.NET MVC4进行项目。我正在使用实体框架即代码优先。我试图将具有 2 个用户对象的对象项目保存为创建者和修改者。
这是我的模型:
public abstract class BaseEntity
{
public DateTime Created { get; set; }
public virtual User CreatedBy { get; set; }
public DateTime Modified { get; set; }
public virtual User ModifiedBy { get; set; }
}
public class Item:BaseEntity
{
public int Id { get; set; }
public String Name { get; set; }
}
public class User //: BaseEntity
{
public int Id { get; set; }
public String UserName { get; set; }
public String Password { get; set; }
public DateTime LastLogin { get; set; }
}
映射类:
public class ItemMap : EntityTypeConfiguration<Item>
{
public ItemMap()
{
this.HasKey(I => I.Id); // I is arbitary varaiable which represent Item ... It is known as lamda expression ... similar to the anonymous method
this.Property(I => I.Name)
.IsRequired()
.HasMaxLength(50);
this.HasOptional(I => I.CreatedBy).WithMany().HasForeignKey(I => I.CreatedBy.Id);
this.HasOptional(I => I.ModifiedBy).WithMany().HasForeignKey(I => I.ModifiedBy.Id);
}
}
数据库上下文:
public class InventoryContext:DbContext
{
public InventoryContext()
: base("InventoryContext")
{
}
public DbSet<Item> Items { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
项目控制器 仅创建和编辑(保存部分):
[HttpPost]
public ActionResult Create(Item item)
{
if (ModelState.IsValid)
{
User user = db.Users.Find(1);
item.CreatedBy = user;
db.Items.Add(item);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(item);
}
[HttpPost]
public ActionResult Edit(Item item)
{
if (ModelState.IsValid)
{
User user = db.Users.Find(2);
item.CreatedBy = user; // just for test to see any relational object updates
item.ModifiedBy = user;
db.Entry(item).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(item);
}
这是我用来解决问题的测试代码的一部分。现在,用户在创建期间正确保存,但在编辑期间无法正确保存。所有其他值都是编辑期间的更新,但不是关系对象 User;创建者和修改者
你能帮我解决它,让我知道我的代码中到底发生了什么吗?
谢谢萨迪
好的,我知道了。这是带有注释的解决方案,以便澄清
[HttpPost]
public ActionResult Edit(Item item)
{
if (ModelState.IsValid)
{
User user = db.Users.Find(2); // find the user; later implement the session
db.Items.Attach(item); // attach item manually to track changes of Relational object of item
db.Entry(item).Reference(i => i.ModifiedBy).Load(); // load the User object of item property ModifiedBy; since it is virtual aka lazy loading
item.ModifiedBy = user; // assing user to ModifiedBy
db.Entry(item).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(item);
}
但它有一个小问题。如果我更改用户;然后更改将保存在用户对象/表中,尽管我不想保存它。