我有一个像
这样的课程 public class Document
{
[Key]
public int Id { get; set; }
public User ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
}
这里“User”是一个具有一些属性的类(都是原始类型) 这是我的类Document
的映射 HasRequired(a => a.ModifiedBy).WithMany().Map(b => b.MapKey("ModifiedBy")).WillCascadeOnDelete(false)
;
因此在表“Document”中,ModifiedBy是一个外键。
我正在尝试更新ID为10的文档的ModifiedBy字段
Document document= new Document();
using (DBContext ctx = new DBContex()) {
User loggedinUser =ctx.Users.Where(u=>u.LoginId==loggedInUserId).FirstOrDefault() as User;
document.id=10;
document.ModifiedBy = loggedinUser;
document.ModifiedDate = DateTime.Now;
ctx.Entry(document).State = EntityState.Modified;
ctx.SaveChanges();
}
但ModifiedBy字段未更新。只有ModifiedDate字段正在更新。
请注意,我没有更新User表的内容。 我只想更新文档表
答案 0 :(得分:0)
这就是我在你的情况下会做的事情:
using (var ctx = new DBContext()) {
var loggedinUser = ctx.Users.SingleOrDefault(u=>u.LoginId==loggedInUserId);
if (loggedinUser == null) throw new Exception("Can't find logged in user");
var document = ctx.Documents.SingleOrDefault(x => x.id == 10);
if (document == null) throw new Exception("Can't find associated document");
document.ModifiedBy = loggedinUser;
document.ModifiedDate = DateTime.Now;
ctx.SaveChanges();
}
现在我这样做的原因。
当我var document = ctx.Documents.SingleOrDefault(x => x.id == 10);
时,我将该特定实体称为EF的更改跟踪器。这意味着如果我更改其ModifiedDate
EF等任何属性,则会自动执行ctx.Entry(document).State = EntityState.Modified;
。
如果你不这样做,并且你想继续你的方式,那么你需要添加这一行(我相信):
document.ModifiedDate = DateTime.Now;
ctx.Documents.Attach(document);
ctx.Entry(document).State = EntityState.Modified;
ctx.SaveChanges();
答案 1 :(得分:0)
基于Entity Framework does not update Foreign Key object 我创建了
public string ModifiedBy { get; set; }
[DataMember]
[ForeignKey("ModifiedBy")]
public User ModifiedUser
{
get;
set;
}
这意味着我还为Modified User和指定的ForeignKey引入了一个原始类型(string ModifiedBy)。 这解决了我的问题