实体框架,使用SQLQuery加载的对象在修改某些属性值后状态更改为已修改
本文关键字:修改 属性 状态 SQLQuery 使用 加载 实体 对象 框架 | 更新日期: 2023-09-27 18:29:03
当我使用DBContext.Database.SqlQuery("选择*FROM表")时;为了加载对象,DBContext.ChangeTracker.Entries()中加载的对象状态始终保持不变,即使我修改了一些属性。。我试图用DBContext.Entry(Object).State=State.Modified手动更改它,但它却引发了错误。。
我需要用原始SqlQuery加载,因为我需要在选择后锁定表,以便使用自动编号。。
public double GetAutoNo(eVoucherContext context, string lookUpValue, int requiredNumber)
{
AutoNumberDetail autoNumberDetail = context.Database.SqlQuery<AutoNumberDetail>("SELECT * FROM AutoNumberDetails WITH (HOLDLOCK XLOCK ROWLOCK) WHERE AutoNumberId = '" + Id.ToString() + "' AND LookUpValue = '" + lookUpValue + "'").FirstOrDefault();
if (autoNumberDetail == null)
{
autoNumberDetail = new AutoNumberDetail();
autoNumberDetail.AutoNumberId = Id;
autoNumberDetail.LookUpValue = lookUpValue;
autoNumberDetail.LastNumber = 0;
context.AutoNumberDetails.Add(autoNumberDetail);
}
double currentNumber = autoNumberDetail.LastNumber + 1;
autoNumberDetail.LastNumber += requiredNumber; //I Need it to track that the LastNumber already changed, so when I call saveChanges on context, it can update my LastNumber
return currentNumber;
}
更新:已经获得了解决方案,请使用DbContext.AutoNumberDetails.SqlQuery代替
您可以使用AttachListEntries
public void AttachListEntries<T>(List<T> entries) where T : class
{
for (var i = 0; i < entries.Count; i++)
{
var result = AttachToAndGetIfExists(entries[i]);
if (result != null)
{
entries[i] = result;
}
}
}
public T AttachToAndGetIfExists<T>(T entity) where T : class
{
var objContext = ((IObjectContextAdapter)Context).ObjectContext;
ObjectSet<T> objectSet = objContext.CreateObjectSet<T>();
var key = objContext.CreateEntityKey(string.Format("{0}.{1}", objectSet.EntitySet.EntityContainer.Name, objectSet.EntitySet.Name), entity);
ObjectStateEntry entry;
if (objContext.ObjectStateManager.TryGetObjectStateEntry(key, out entry))
{
if (entry.State == EntityState.Detached)
{
objContext.AttachTo(key.EntitySetName, entry);
}
return (T)entry.Entity;
}
objContext.AttachTo(key.EntitySetName, entity);
return null;
}