C# 使用EntityFramework时是否更新导航属性?
按实体框架保存模型时,如何设置导航属性 我的所有模型都继承自modelbase类,modelbase类有一个名为ModelState的枚举属性C# 使用EntityFramework时是否更新导航属性?,c#,entity-framework,C#,Entity Framework,按实体框架保存模型时,如何设置导航属性 我的所有模型都继承自modelbase类,modelbase类有一个名为ModelState的枚举属性 public class ModelBase : IModel.IModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Display(Name = "唯一标识符")] public virtual Guid Id { get; set;
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;
}
public virtual int AddOrUpdate(IEnumerable模型)
{
var modelList=models.ToList();
检查模型(模型列表);
foreach(modelList.Where(model=>model.IsNew)中的var模型)
{
DbContext.Set().Add(模型);
}
var result=DbContext.SaveChanges();
foreach(modelList.Where(model=>model.IsNew)中的var模型)
{
model.ModelState=ModelState.UnChanged;
}
返回结果;
}
实体有一个活动周期(新的/修改的/删除的)等。当您创建一个新实体时,您知道它不在数据库中,并且状态为New。通常,在查找某些数据时,会在数据库中搜索实体标识符。在断开实体连接的情况下,如果实体发生更改,则必须手动更改实体状态,如:dbContext.Entry(ModelBase.state=EntityState.Modified
如果您有批量插入或批量删除,那么有许多方法可以帮助您避免性能问题
- 1) 使用EntityFramework.BulkInsert
- 2) 禁用changetracker
还有许多其他方法。NotMapped表示您不需要将它们存储在数据库中?为什么在实体POCO对象中有它?!!如果您正在处理断开连接的实体,则实体状态中有其信息。我使用ModelState跟踪数据库中是否存在该模型。如果我使用IsExist方法,将执行一个花费大量时间的sql查询。我做得对吗?实体有一个新的/更改的/删除的生命周期等。当您创建一个新实体时,您知道它不在数据库中。通常,在查找某些数据时,会在数据库中搜索标识符。您可以这样做:dbContext.Entry(ModelBase.State=EntityState.Unchanged;谢谢,我试过了。但我需要在一分钟内存储10000多条记录。检查每个模型的状态需要花费太多的时间……如果您有很多项,并且希望插入它们,那么请使用EntityFramework.BulkInsert