更新导航属性使用EntityFramework时?

时间:2016-06-14 07:31:25

标签: c# entity-framework

当我按实体框架保存模型时,如何设置导航属性?

我的所有模型都继承自modelbase类,而modelbase类有一个名为ModelState的枚举。

public class ModelBase : IModel.IModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Display(Name = "唯一标识符")]
    public virtual Guid Id { get; set; }

    [NotMapped]
    [Display(Name = "模型状态")]
    public virtual ModelState ModelState { get; set; } = ModelState.UnChanged;

    [NotMapped]
    [Display(Name = "是否新创建对象")]
    public virtual bool IsNew => ModelState == ModelState.Added || ModelState == ModelState.AddedFromDb;
}

然后我发现当我通过DbContext.SaveChanges()保存模型时。不仅我传入的模型,而且模型的导航属性将同时保存。

那么,当我保存某些模型时,如何更新导航属性?

我目前这样保存:

public virtual int AddOrUpdate(IEnumerable<T> models)
    {
        var modelList = models.ToList();
        CheckModel(modelList);

        foreach (var model in modelList.Where(model => model.IsNew))
        {
            DbContext.Set<T>().Add(model);
        }

        var result = DbContext.SaveChanges();

        foreach (var model in modelList.Where(model => model.IsNew))
        {
            model.ModelState = ModelState.UnChanged;
        }

        return result;
    }

1 个答案:

答案 0 :(得分:0)

实体具有实时循环(新建/修改/删除)等。当您创建新实体时,您知道它不在数据库中且状态为新。通常,当您查找某些数据时,您会在数据库中搜索实体标识符。如果断开连接的实体,您必须手动更改实体状态,如果实体已更改,请执行以下操作: dbContext.Entry(ModelBase).State = EntityState.Modified

如果您有批量插入或批量删除,那么有很多方法可以帮助您避免性能问题。

  • 1)使用EntityFramework.BulkInsert
  • 2)禁用changetracker

以及许多其他方式。