shuxinqin / Chloe

A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET --C#
https://github.com/shuxinqin/Chloe/wiki
MIT License
1.52k stars 455 forks source link

不能给数据表创建索引吗, 没找到相关特性,文档里也没说明。 #338

Closed CHenBuCHen closed 2 years ago

CHenBuCHen commented 2 years ago

找到一个 UniqueIndexAttribute 注释是唯一索引, 没有非唯一的索引吗。 而且用了下这个 UniqueIndexAttribute 也不起作用呀。 实际查看下来并没有创建索引。

CHenBuCHen commented 2 years ago

另外问一下 为什么不支持 long 做主键自增。 sqlite 里 当主键自增大于int32 时会用 int64 保存,那么程序就会报错 OverflowException: Value was either too large or too small for an Int32. 还有就是如果用int32 做主键,因为数据太多主键数字溢出了怎么办。

能不能就是说将数据重新排列,重新填充因为被删除而空缺出来的主键,如下 在使用过程中 主键:1,2,3,4,5.......100,101,.... 因为业务原因部分数据删除了剩下了:1,5,10,11......100,101,130.....此时主键溢出了,重新排列数据,使用被删除部分的主键是否可行。 因为我的业务数据不是很大,肯定不会超过int32,就怕因为时间的积累而溢出了。为此分库分表 是不是太复杂了。所以是这么个思路

shuxinqin commented 2 years ago
CHenBuCHen commented 2 years ago
  • UniqueIndexAttribute 目前只是在分片情况下用来做查询优化而已,其他地方还没用上。
  • 支持long做自增的,你那边用long自增出现了什么问题?
  • 重新排列数据,使用被删除部分的主键- - 这个业界也没解决方案吧

先谢谢作者,非常感谢!

那怎么给表建索引

开发环境 Unity3D 2021 、 数据库 Sqlite,引用DLL Chloe.dll、Chloe.Extension.dll、Chloe.SQLite.dll、Mono.Data.Sqlite.dll 如下报错

SqliteException: SQLite error AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, System.UInt32 timeoutMS, System.String& strRemain) (at :0)

数据类型同时也不支持 ushort、 ulong。我用的 Mono.Data.Sqlite, 不是System.Data.Sqlite 会用影响吗。

NotSupportedException: System.UInt64 Chloe.SQLite.DDL.SQLiteTableGenerator.GetDataTypeName (Chloe.Descriptors.PrimitivePropertyDescriptor propertyDescriptor) (at <5395145902a54cc3aae90b899e279191>:0)

NotSupportedException: System.UInt64 Chloe.SQLite.DDL.SQLiteTableGenerator.GetDataTypeName (Chloe.Descriptors.PrimitivePropertyDescriptor propertyDescriptor) (at <5395145902a54cc3aae90b899e279191>:0)

代码如下

    [Table]
    public class Actor
    {
        [Column(IsPrimaryKey = true)]
        public long ID { get; set; }
        public ulong AssetID { get; set; }
        public ushort LocationID { get; set; }
        public string Name { get; set; }
        public float PosX { get; set; }
        public float PosY { get; set; }
        public float PosZ { get; set; }
    }
    public class SQLiteConnectionFactory : IDbConnectionFactory
    {
        private string _connString = null;

        public SQLiteConnectionFactory(string connString)
        {
            this._connString = connString;
        }

        public IDbConnection CreateConnection()
        {
            IDbConnection conn = null;
            conn = new SqliteConnection("Data Source=" + _connString);
            return conn;
        }
    }
    using (var conn = new SQLiteContext(new SQLiteConnectionFactory(path)))
    {
        var tableGenerator = new SQLiteTableGenerator(conn);
        tableGenerator.CreateTables(new[] { typeof(Actor) });
    }
shuxinqin commented 2 years ago

SQLiteTableGenerator 不是一个完善的功能,不要在项目里用(确切的说是我用来做简单的建表做测试的,很多建表细节都没处理,后悔放在框架里了,造成了大家误用- -)。 如果需要建表,手写DDL语句吧,自己把控建表语句。- -

shuxinqin commented 2 years ago

image 当然,如果你需要用SQLiteTableGenerator的话,可以先自己在这加如上那段代码,就能解决你遇上的 long 自增问题

CHenBuCHen commented 2 years ago

明白了, 非常感谢!