【问题标题】:Foreign key not updating in entity frame work实体框架中的外键未更新
【发布时间】:2015-06-17 00:24:12
【问题描述】:

我有一门课

 public class Document
        {
            [Key]
            public int Id { get; set; }
            public User ModifiedBy { get; set; } 
            public DateTime ModifiedDate { get; set; } 

        }

这里的“用户”是一个具有一些属性的类(都是原始类型) 这是我对文档类的映射

HasRequired(a => a.ModifiedBy).WithMany().Map(b => b.MapKey("ModifiedBy")).WillCascadeOnDelete(false);

所以在“文档”表中,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 字段正在更新。

请注意,我不更新用户表。 我只想更新文档表

【问题讨论】:

  • 您希望通过该特定 ID 从数据库中获取文档。 ctx.Users.Where(u=>u.LoginId==loggedInUserId).FirstOrDefault() as User 可以简化为ctx.Users.FirstOrDefault(u => u.LoginId == loggedInUserId) 并且你需要考虑是使用FirstOrDefault 还是SingleOrDefault
  • 谢谢,但这不是答案
  • 这就是它出现在 cmets 中的原因.....和 ​​p.s.这也是一个答案,最重要的是,不是非常明确

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


【解决方案1】:

在你的情况下我会这样做:

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();  

【讨论】:

  • 这只是一个示例,我没有 2 个属性。我有大约 15 个属性。所以像你那样做更新对我没有好处
  • 好吧,我已经回答了你上面的问题。您在 cmets 中提出的案例实际上并不是 Stackoverflow 问题。 Meta Stackoverflow 更是如此。
  • 谢谢卡勒姆,但是 ctx.Documents.Attach(document); ctx.Entry(document).State = EntityState.Modified;没有帮助我
【解决方案2】:

基于Entity Framework does not update Foreign Key object 我创造了

public string ModifiedBy { get; set; }

[DataMember]
[ForeignKey("ModifiedBy")] 
public User ModifiedUser
        {
            get;
            set;
        }

这意味着我还为 Modified User 引入了一个原始类型(字符串 ModifiedBy )并指定了 ForeignKey。 这解决了我的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多