外键C#一对多没有设置实体框架

时间:2017-05-15 14:53:40

标签: c# entity-framework

我尝试更新文本状态和外键状态ID。

public class Model : DbModelBuilder
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }

    [Required]
    public string Status { get; set; } //relationship mappings

    public virtual Statuses StatusId { get; set; }
}

public class Statuses
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int id { get; set; }

    [Required] public string StatusName { get; set; }
}

public void updateStatus(String status, int statusId = 0)
{
    using (Context ctx = new Context())
    {
        if (statusId != 0)
        {
            if (ctx.Statuses.Any(ts => ts.id == statusId))
            {
                model.StatusId = ctx.Statuses.Find(statusId);
            }
        }
        model.Status = status;
        ctx.Entry(model).State = EntityState.Modified;
        ctx.SaveChanges();
    }
}

文本状态设置正确,但外键状态未更新。

在更新整个模型时,我在另一个类中有类似的功能,它没有任何问题。

我能够通过记录信息来查看模型更新。但是,如果我在ctx.savechanges()之后记录ctx.model.statusId,则statusId不会更新。

1 个答案:

答案 0 :(得分:0)

我看到它的方式,这里有3条可能的执行路径:

  1. statusId参数为零,并且if块中的代码未执行。
  2. statusId参数不为零,但与数据库中任何现有Statuses条目的ID不匹配(因此Any()测试失败并且分配给{{1没有完成)。
  3. model.StatusId参数非零且 匹配现有statusId条目的ID(因此Statuses测试成功,并且分配到Any() 已完成
  4. 如果#1我希望model.StatusId字段由model.StatusId更新,因为尽管您已经设置了SaveChanges属性string,没有任何内容可以将其与Status实体相关联或导致EF认为他们相关。

    与案例#2相同,因为没有进行额外的分配。

    对于案例#3,您在调用Statuses之前设置了StatusId属性,因此在之后仍应设置 SaveChanges

    所以...我不确定您认为哪种情况失败,或者您认为SaveChanges值会更新的原因?