实体框架,使用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代替

实体框架,使用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;
    }