返回

ORM 教程:更新数据时跳过列

见解分享

无视特定列更新数据:FreeSql ORM 指南

在数据库操作中,更新数据时有选择地更新特定列的需求非常普遍。FreeSql ORM 提供了两种强大的方法来实现这一目标:IgnoreColumns()SetSource()。本文将深入探讨这两种方法,并通过代码示例演示它们的使用。

忽略列更新:IgnoreColumns() 方法

IgnoreColumns() 方法允许您指定在更新操作中应忽略的列。它采用一个 lambda 表达式作为参数,该表达式返回一个表示要忽略的列的布尔值。

using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 IgnoreColumns() 方法忽略 Email 列
            fsql.GetRepository<User>().Update(user, ignoreColumns: a => a.Email);

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 IgnoreColumns() 方法忽略 Email 列
            fsql.GetRepository<User>().Update(user, ignoreColumns: a => a.Email);

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Name: {updatedUser.Name}"
); // John Doe Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 IgnoreColumns() 方法忽略 Email 列
            fsql.GetRepository<User>().Update(user, ignoreColumns: a => a.Email);

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Age: {updatedUser.Age}"
); // 20 Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 IgnoreColumns() 方法忽略 Email 列
            fsql.GetRepository<User>().Update(user, ignoreColumns: a => a.Email);

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Email: {updatedUser.Email}"
); // johndoe@example.com Console.ReadKey(); } } }

在上面的示例中,我们创建了一个 User 实体类,其中包含 Id, Name, AgeEmail 列。然后,我们创建一个 user 对象并将其保存到数据库中。接下来,我们使用 IgnoreColumns() 方法忽略 Email 列的更新。最后,我们验证了更新后 Email 列的值保持不变。

指定更新列:SetSource() 方法

SetSource() 方法提供了一种更加灵活的方式来指定要更新的列。它采用一个 lambda 表达式作为参数,该表达式返回一个表示要更新的列的新实体。

using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 SetSource() 方法设置要更新的列
            fsql.GetRepository<User>().Update(user, user => new User
            {
                Name = user.Name,
                Age = user.Age
            });

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 SetSource() 方法设置要更新的列
            fsql.GetRepository<User>().Update(user, user => new User
            {
                Name = user.Name,
                Age = user.Age
            });

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Name: {updatedUser.Name}"
); // John Doe Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 SetSource() 方法设置要更新的列
            fsql.GetRepository<User>().Update(user, user => new User
            {
                Name = user.Name,
                Age = user.Age
            });

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Age: {updatedUser.Age}"
); // 20 Console.WriteLine(
using FreeSql.DataAnnotations;
using FreeSql.Entities.Column;
using System;
using System.Collections.Generic;
using System.Linq;

namespace FreeSqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 FreeSql 对象
            var fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=demo.db")
                .UseAutoSyncStructure(true) // 自动同步实体结构到数据库
                .Build();

            // 定义一个 User 实体类
            [Table(Name = "User")]
            class User
            {
                [Column(IsIdentity = true)]
                public int Id { get; set; }

                [Column(StringLength = 50)]
                public string Name { get; set; }

                [Column(DbType = "INT")]
                public int Age { get; set; }

                [Column(StringLength = 100)]
                [JsonIgnore] // 使用 JsonIgnore 特性忽略该列
                public string Email { get; set; }
            }

            // 创建一个 User 对象
            var user = new User
            {
                Id = 1,
                Name = "John Doe",
                Age = 20,
                Email = "johndoe@example.com"
            };

            // 使用 SetSource() 方法设置要更新的列
            fsql.GetRepository<User>().Update(user, user => new User
            {
                Name = user.Name,
                Age = user.Age
            });

            // 提交更改
            fsql.SaveChanges();

            // 验证 Email 列是否未更新
            var updatedUser = fsql.GetRepository<User>().Find(user.Id);
            Console.WriteLine($"Name: {updatedUser.Name}"); // John Doe
            Console.WriteLine($"Age: {updatedUser.Age}"); // 20
            Console.WriteLine($"Email: {updatedUser.Email}"); // johndoe@example.com

            Console.ReadKey();
        }
    }
}
quot;Email: {updatedUser.Email}"
); // johndoe@example.com Console.ReadKey(); } } }

在这个示例中,我们使用 SetSource() 方法指定只更新 NameAge 列。新实体只包含要更新的列的值,其他列的值保持不变。

结论

IgnoreColumns()SetSource() 方法为 FreeSql ORM 用户提供了强大的工具来控制更新操作中受影响的列。通过使用这些方法,您可以轻松地忽略特定列或指定要更新的列,从而实现数据更新的精细控制。

常见问题解答

1. 什么时候应该使用 IgnoreColumns() 方法?

当您只想忽略更新特定列时,应使用 IgnoreColumns() 方法。这比使用 SetSource() 方法更简洁,因为它不需要创建新实体。

2. 什么时候应该使用 SetSource() 方法?

当您需要更精细地控制更新操作时,应使用 SetSource() 方法。此方法允许您指定要更新的列以及这些列的值。

3. 我可以同时使用 IgnoreColumns()SetSource() 方法吗?

不,您不能同时使用 IgnoreColumns()SetSource() 方法。这两个方法具有互斥性,只能选择一个。

4. IgnoreColumns()SetSource() 方法是否支持嵌套更新?

是的,IgnoreColumns()SetSource() 方法都支持嵌套更新。您可以使用它们来更新具有复杂层次结构的实体。

5. 是否可以动态确定要忽略或更新的列?

是的,您可以动态确定要忽略或更新的列。只需在 IgnoreColumns()SetSource() 方法的 lambda 表达式中使用条件语句即可。