外键未在实体框架中更新

时间:2015-06-15 13:32:53

标签: c# .net entity-framework foreign-keys

我有一个像

这样的课程
 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表的内容。 我只想更新文档表

2 个答案:

答案 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)。 这解决了我的问题

相关问题