ORM 教程:更新数据时跳过列
2023-09-08 14:07:38
无视特定列更新数据: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
, Age
和 Email
列。然后,我们创建一个 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()
方法指定只更新 Name
和 Age
列。新实体只包含要更新的列的值,其他列的值保持不变。
结论
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 表达式中使用条件语句即可。