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

C# 实体框架:代码优先:为什么更新时不保存关系/关联对象?,c#,entity-framework,asp.net-mvc-4,ef-code-first,code-first,C#,Entity Framework,Asp.net Mvc 4,Ef Code First,Code First,我来自PHP背景;现在正在使用ASP.NET MVC4进行一个项目。我首先使用实体框架作为代码。我试图将一个对象项目保存为CreatedBy和ModifiedBy 这是我的模型: public abstract class BaseEntity { public DateTime Created { get; set; } public virtual User CreatedBy { get; set; } public DateTime Modified { get;

我来自PHP背景;现在正在使用ASP.NET MVC4进行一个项目。我首先使用实体框架作为代码。我试图将一个对象项目保存为CreatedByModifiedBy

这是我的模型:

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);
    }
}
这是我用来解决问题的测试代码的一部分。现在,用户创建期间正确保存,但在编辑期间不正确保存。所有其他值都是在编辑过程中更新的,但不是关系对象用户CreatedByModifiedBy

请你帮我解决这个问题,让我知道我的代码中到底发生了什么

多谢各位
萨迪

好的,我明白了。这是一个带有注释的解决方案

[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);
}

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

您是否检查了编辑方法中的(ModelState.IsValid)是否为
true
?是否在
OnModelCreating
中注册
ItemMap
?我不这么认为,因为它有一个问题。不能将外键表示为
I.CreatedBy.Id
。属性必须是
Item
本身的属性(如
int CreatedById
),或者必须删除
HasForeignKey
子句。请先解决此问题,如果问题仍然存在,请返回。@Kaf是的,我已对其进行调试,它成功地保存了除USER@GertArnold在主项目中是这样,但在示例测试项目中不是这样。好的,让我在注册OnModelCreating后检查一下它是否有效。尽管它在插入过程中工作正常。
    [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);
    }
[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);
}