实体框架:代码优先:为什么更新时不保存关系/关联对象



我来自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);
}

但它有一个小问题。如果我更改用户;然后更改将保存在用户对象/表中,尽管我不想保存它。

最新更新