Skip to content

Wrong bulk update query #357

Open
Open
@letarak

Description

@letarak

DO 7.1.1
Structure inner field bulk update produce wrong sql query, see code sample below

    private static async Task Main(string[] args)
    {
        try
        {
            DbHelper.ExecuteNonQuery("DROP DATABASE [DO-Tests]");
        }
        catch (Exception)
        {
        }

        DbHelper.ExecuteNonQuery("CREATE DATABASE [DO-Tests]");

        var dc = new DomainConfiguration("sqlserver", new SqlConnectionStringBuilder(DbHelper.ConnectionString()).ToString());

        dc.Sessions.Add(new SessionConfiguration(WellKnown.Sessions.Default) { BatchSize = 25 });
        
        dc.Types.Register(typeof(StructureEntity));
        dc.Types.Register(typeof(SqlLogModule));

        dc.UpgradeMode = DomainUpgradeMode.Recreate;

        await using var d = await Domain.BuildAsync(dc);

        await using var s = await d.OpenSessionAsync();
        await using var t = await s.OpenTransactionAsync();
        
        SqlLogModule.Enabled = true;
        
        await s.Query.All<StructureEntity>()
            .Set(it => it.Field1.Value, it => it.Field1.Value + it.Field2.Value)
            .UpdateAsync();
        
        await s.Query.All<StructureEntity>()
            .Set(it => it.Field2.Value, it => it.Field1.Value + it.Field2.Value)
            .UpdateAsync();
        
        await s.Query.All<StructureEntity>()
            .Set(it => it.Field1.Value, it => it.Field2.Value + it.Field1.Value)
            .UpdateAsync();
        
        await s.Query.All<StructureEntity>()
            .Set(it => it.Field2.Value, it => it.Field2.Value + it.Field1.Value)
            .UpdateAsync();
            
        SqlLogModule.Enabled = false;
    }

    [HierarchyRoot]
    public class StructureEntity : Entity
    {
        public StructureEntity(Session session) : base(session)
        {
        }

        [Key] [Field(Nullable = false)] public int Id { get; set; }
        
        [Field]
        public StructureField Field1 { get; set; }
        
        [Field]
        public StructureField Field2 { get; set; } 
    }
    
    public class StructureField : Structure
    {
        [Field]
        public decimal Value { get; set; }
    }

    /// <summary>SqlLogModule</summary>
    public class SqlLogModule : IModule
    {
        public static bool Enabled { get; set; }
        
        /// <inheritdoc />
        public void OnBuilt(Domain domain)
        {
            domain.SessionOpen += (source, args) =>
            {
                var accessor = args.Session.Events;

                accessor.DbCommandExecuting += DbCommandExecuting;
            };
        }

        /// <inheritdoc />
        public void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model)
        {
        }

        private void DbCommandExecuting(object? sender, DbCommandEventArgs e)
        {
            if (Enabled)
            {
                Console.WriteLine(e.Command.CommandText);
            }
        }
    }

Output

UPDATE [dbo].[Program.StructureEntity] SET [Field1.Value] = ([Program.StructureEntity].[Field1.Value] + [Program.StructureEntity].[Field2.Value]);

UPDATE [dbo].[Program.StructureEntity] SET [Field1.Value] = ([Program.StructureEntity].[Field1.Value] + [Program.StructureEntity].[Field2.Value]);

UPDATE [dbo].[Program.StructureEntity] SET [Field1.Value] = ([Program.StructureEntity].[Field2.Value] + [Program.StructureEntity].[Field1.Value]);

UPDATE [dbo].[Program.StructureEntity] SET [Field1.Value] = ([Program.StructureEntity].[Field2.Value] + [Program.StructureEntity].[Field1.Value]);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions