【发布时间】:2019-02-27 19:35:39
【问题描述】:
AUTOINCREMENT doesn't usually need to be used in SQLite. 即使没有这个关键字,自动生成的 ID 也可以工作。
但是,当使用 Entity Framework Core(从 2.1.3 开始)和 SQLite 时,整数主键被声明为 AUTOINCREMENT。有没有办法避免这种情况?
我尝试将[DatabaseGenerated(DatabaseGeneratedOption.None)] 属性添加到实体的主键属性,但这完全禁用了自动键生成,我必须为每次插入手动设置它。否则,EFC 会尝试使用显式 Id = 0 插入。
所以我需要将其视为插入时生成的数据库,我只是想避免不必要的 AUTOINCREMENT 关键字。有没有办法做到这一点?
编辑
这是一些示例 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();
}
}
}
}
当使用 SQLite 的 DB Browser 查看时,这将创建一个如下所示的数据库:
我宁愿不将主键声明为 AUTOINCREMENT,这也会创建 sqlite_sequence 表。 SQLite 可以在没有该关键字的情况下生成密钥,而且它更简单、更快。
【问题讨论】:
-
浏览实体框架文档,我认为不可能不编写自己的自定义后端而不是使用标准的sqlite。
标签: c# .net sqlite .net-core entity-framework-core