C# 实体框架:代码优先:为什么更新时不保存关系/关联对象?
我来自PHP背景;现在正在使用ASP.NET MVC4进行一个项目。我首先使用实体框架作为代码。我试图将一个对象项目保存为CreatedBy和ModifiedBy 这是我的模型: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;
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);
}
}
这是我用来解决问题的测试代码的一部分。现在,用户在创建期间正确保存,但在编辑期间不正确保存。所有其他值都是在编辑过程中更新的,但不是关系对象用户CreatedBy和ModifiedBy
请你帮我解决这个问题,让我知道我的代码中到底发生了什么
多谢各位
萨迪好的,我明白了。这是一个带有注释的解决方案
[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);
}