代码之家  ›  专栏  ›  技术社区  ›  relatively_random

如何使用EFC和SQLite避免AUTOINCREMENT关键字?

  •  1
  • relatively_random  · 技术社区  · 6 年前

    AUTOINCREMENT doesn't usually need to be used in SQLite.

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

    编辑

    下面是一些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

    我不希望将主键声明为AUTOINCREMENT,这也会创建sqlite\u序列表。SQLite可以生成没有关键字的键,而且它更简单、更快。

    2 回复  |  直到 4 年前
        1
  •  2
  •   Ivan Stoev    6 年前

    据我所知,这个问题是由当前版本中的以下代码引起的 SqliteMigrationsAnnotationProvider 班级:

    if (property.ValueGenerated == ValueGenerated.OnAdd
        && property.ClrType.UnwrapNullableType().IsInteger()
        && !HasConverter(property))
    {
    
        yield return new Annotation(SqliteAnnotationNames.Autoincrement, true);
    }
    

    SqliteMigrationsSqlGenerator 类到 include AUTOINCREMENT .

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

    modelBuilder.Entity<Entity>()
        .Property(e => e.Id)
        .HasConversion(v => v, v => v);
    
        2
  •  0
  •   Vivek Nuna Chetan sabhaya    6 年前

    [NotMapped]
    public override int Id
    {
        get
        {
            return PKColumn;
        }
        set
        {
            PKColumn = value;
        }
    }
    
    [Key]
    public virtual int PKColumn { get; set; }