gpt4 book ai didi

c# - 如何使用 EFC 和 SQLite 避免使用 AUTOINCRMENT 关键字?

转载 作者:行者123 更新时间:2023-12-02 01:50:41 26 4
gpt4 key购买 nike

AUTOINCREMENT doesn't usually need to be used in SQLite.即使没有此关键字,自动生成的 ID 也可以工作。

但是,在使用 Entity Framework Core(从 2.1.3 开始)和 SQLite 时,整数主键被声明为 AUTOINCRMENT。有办法避免这种情况吗?

我尝试添加 [DatabaseGenerated(DatabaseGeneratedOption.None)]属性到实体的主键属性,但这会完全禁用自动键生成,我必须为每个插入手动设置它。否则,EFC 尝试插入显式 Id = 0 .

所以我需要将其视为插入时生成的数据库,我只是想避免不必要的 AUTOINCRMENT 关键字。有办法做到这一点吗?

编辑

下面是一些 C# 代码示例:

using System;
using Microsoft.EntityFrameworkCore;

namespace Experiments
{
public class Entity
{
public long Id { get; set; }

public string Text { get; set; }
}

public class Context : DbContext
{
public DbSet<Entity> Entities { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=temp.sqlite");
}
}

public static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static void Main()
{
using (var context = new Context())
{
context.Database.EnsureCreated();
}
}
}
}

这将创建一个如下所示的数据库,当使用 DB Browser for SQLite 查看时:

enter image description here

我不想将主键声明为 AUTOINCRMENT,这也会创建 sqlite_sequence 表。 SQLite 可以在没有该关键字的情况下生成键,而且它更简单、更快。

最佳答案

据我所知,该问题是由当前 SqliteMigrationsAnnotationProvider 中的以下代码引起的类:

if (property.ValueGenerated == ValueGenerated.OnAdd
&& property.ClrType.UnwrapNullableType().IsInteger()
&& !HasConverter(property))
{

yield return new Annotation(SqliteAnnotationNames.Autoincrement, true);
}

这迫使SqliteMigrationsSqlGenerator类(class) include AUTOINCREMENT .

我不知道为什么会这样,我认为这是一个遗留的错误,但你最好在他们的问题跟踪器中询问。

查看代码,看起来设置假值转换器可以防止这种情况发生,并且可以用作临时解决方法:

modelBuilder.Entity<Entity>()
.Property(e => e.Id)
.HasConversion(v => v, v => v);

关于c# - 如何使用 EFC 和 SQLite 避免使用 AUTOINCRMENT 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52476810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com