介绍
接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。
源作者链接:https://blog.okyrylchuk.dev/entity-framework-core-6-features-part-3
正文
SQLite 中的保存点
在 EF Core 6.0 中,SQLite 支持保存点。您可以保存、回滚和释放保存点。
var dbPath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..\\..\\..\\Savepoints.db"));
using var connection = new SqliteConnection($"Data Source={dbPath}");
connection.Open();
using var transaction = connection.BeginTransaction();
// The insert is committed to the database
using (var command = connection.CreateCommand())
{
command.CommandText = @"INSERT INTO People (Name) VALUES ('Oleg')";
command.ExecuteNonQuery();
}
transaction.Save("MySavepoint");
// The update is not commited since savepoint is rolled back before commiting the transaction
using (var command = connection.CreateCommand())
{
command.CommandText = @"UPDATE People SET Name = 'Not Oleg' WHERE Id = 1";
command.ExecuteNonQuery();
}
transaction.Rollback("MySavepoint");
transaction.Commit();
内存数据库验证所需属性
在 EF Core 6.0 中,内存数据库验证所需的属性。如果您尝试为所需属性保存具有空值的实体,则会引发异常。如有必要,您可以禁用此验证。
using var context = new ExampleContext();
var blog = new Blog();
context.Blogs.Add(blog);
await context.SaveChangesAsync();
// Unhandled exception. Microsoft.EntityFrameworkCore.DbUpdateException:
// Required properties '{'Title'}' are missing for the instance of entity
// type 'Blog' with the key value '{Id: 1}'.
class Blog
{
public int Id { get; set; }
[Required]
public string Title { get; set; }
}
class ExampleContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options
.EnableSensitiveDataLogging()
.LogTo(Console.WriteLine, new[] { InMemoryEventId.ChangesSaved })
.UseInMemoryDatabase("ValidateRequiredProps");
// To disable the validation
// .UseInMemoryDatabase("ValidateRequiredProps", b => b.EnableNullChecks(false));
}
EF.Functions.Contains 带值转换器
您可以将EF.Functions.Contains方法与使用 EF Core 6.0 中的值转换器(也与二进制列)映射的列一起使用。
using var context = new ExampleContext();
var query = context.People
.Where(e => EF.Functions.Contains(e.FullName, "Oleg"))
.ToQueryString();
Console.WriteLine(query);
// SELECT[p].[Id], [p].[FullName]
// FROM[People] AS[p]
// WHERE CONTAINS([p].[FullName], N'Oleg')
class Person
{
public int Id { get; set; }
public FullName FullName { get; set; }
}
public class FullName
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class ExampleContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(x => x.FullName)
.HasConversion(
v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
v => JsonSerializer.Deserialize<FullName>(v, (JsonSerializerOptions)null));
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCore6Contains");
}
结语
联系作者:加群:867095512 @MrChuJiu