Entity Framework Core 3.1 没有为 SQLite 中的实体属性生成正确的数据类型 table
Entity Framework Core 3.1 does not generate the right data types for properties of entities from SQLite table
我使用 SQL 服务器数据类型从脚本创建 SQLite table :
(
ProductId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
CategoryId UNIQUEIDENTIFIER NOT NULL,
SupplierId INTEGER NOT NULL,
Name NVARCHAR (100) NOT NULL,
UnitPrice MONEY NOT NULL DEFAULT 0,
UnitsInStock SMALLINT NOT NULL DEFAULT 0,
UnitsOnOrder SMALLINT NOT NULL DEFAULT 0,
ReorderLevel SMALLINT NOT NULL DEFAULT 0,
Discontinued BIT NOT NULL DEFAULT 0,
QuantityPerUnit NVARCHAR (40),
CONSTRAINT Product_Category_FK FOREIGN KEY(CategoryId)
REFERENCES Category(CategoryId),
CONSTRAINT Product_Supplier_FK FOREIGN KEY(SupplierId)
REFERENCES Supplier(SupplierId)
);
当我使用 SQLite / SQL Server Compact Toolbox 连接到数据库时,我可以看到以下数据类型:
Productld (PK, bigint, not null)
Categoryld (FK, uniqueidentifier, not null)
Supplierld (FK, bigint, not null)
Name (nvarchar, not null)
UnitPrice (money, not null)
UnitslnStock (smallint, not null)
UnitsOn0rder (smallint, not null)
ReorderLevel (smallint, not null)
Discontînued (bit, not null)
QuantityPerUnit (nvarchar, null)
数据类型正确。只有 nvarchar 列的 length 消失了,并且 int 已转换为键列的 bigint ...好吧,那不是问题。
但是当我使用 EF Core 3.1 的 scaffold-dbcontext 实用程序生成 dbcontext 和实体时,这里是为 Product 实体生成的代码:
public partial class Product
{
public Product()
{
OrderDetail = new HashSet<OrderDetail>();
}
public long ProductId { get; set; }
public byte[] CategoryId { get; set; }
public long SupplierId { get; set; }
public string Name { get; set; }
public byte[] UnitPrice { get; set; }
public long UnitsInStock { get; set; }
public long UnitsOnOrder { get; set; }
public long ReorderLevel { get; set; }
public byte[] Discontinued { get; set; }
public string QuantityPerUnit { get; set; }
public virtual Category Category { get; set; }
public virtual Supplier Supplier { get; set; }
public virtual ICollection<OrderDetail> OrderDetail { get; set; }
}
如你所见:
- smallint 已从 short 改为 long
- uniqueidentifier 已更改为 byte[] 而不是 Guid
- money 已更改为 byte[] 而不是 decimal
- bit 已更改为 byte[] 而不是 bool
我对这种行为感到惊讶。为什么 EF Core 不能生成正确的数据类型?当 SQLite Toolbox 能够显示正确的类型时...
有什么办法可以改善吗?
SQLite Toolbox 使用 System.Data.Sqlite,它处理数据类型的方式与 Microsoft.Data.Sqlite(EF Core 使用的)完全不同
我使用 SQL 服务器数据类型从脚本创建 SQLite table :
(
ProductId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
CategoryId UNIQUEIDENTIFIER NOT NULL,
SupplierId INTEGER NOT NULL,
Name NVARCHAR (100) NOT NULL,
UnitPrice MONEY NOT NULL DEFAULT 0,
UnitsInStock SMALLINT NOT NULL DEFAULT 0,
UnitsOnOrder SMALLINT NOT NULL DEFAULT 0,
ReorderLevel SMALLINT NOT NULL DEFAULT 0,
Discontinued BIT NOT NULL DEFAULT 0,
QuantityPerUnit NVARCHAR (40),
CONSTRAINT Product_Category_FK FOREIGN KEY(CategoryId)
REFERENCES Category(CategoryId),
CONSTRAINT Product_Supplier_FK FOREIGN KEY(SupplierId)
REFERENCES Supplier(SupplierId)
);
当我使用 SQLite / SQL Server Compact Toolbox 连接到数据库时,我可以看到以下数据类型:
Productld (PK, bigint, not null)
Categoryld (FK, uniqueidentifier, not null)
Supplierld (FK, bigint, not null)
Name (nvarchar, not null)
UnitPrice (money, not null)
UnitslnStock (smallint, not null)
UnitsOn0rder (smallint, not null)
ReorderLevel (smallint, not null)
Discontînued (bit, not null)
QuantityPerUnit (nvarchar, null)
数据类型正确。只有 nvarchar 列的 length 消失了,并且 int 已转换为键列的 bigint ...好吧,那不是问题。
但是当我使用 EF Core 3.1 的 scaffold-dbcontext 实用程序生成 dbcontext 和实体时,这里是为 Product 实体生成的代码:
public partial class Product
{
public Product()
{
OrderDetail = new HashSet<OrderDetail>();
}
public long ProductId { get; set; }
public byte[] CategoryId { get; set; }
public long SupplierId { get; set; }
public string Name { get; set; }
public byte[] UnitPrice { get; set; }
public long UnitsInStock { get; set; }
public long UnitsOnOrder { get; set; }
public long ReorderLevel { get; set; }
public byte[] Discontinued { get; set; }
public string QuantityPerUnit { get; set; }
public virtual Category Category { get; set; }
public virtual Supplier Supplier { get; set; }
public virtual ICollection<OrderDetail> OrderDetail { get; set; }
}
如你所见:
- smallint 已从 short 改为 long
- uniqueidentifier 已更改为 byte[] 而不是 Guid
- money 已更改为 byte[] 而不是 decimal
- bit 已更改为 byte[] 而不是 bool
我对这种行为感到惊讶。为什么 EF Core 不能生成正确的数据类型?当 SQLite Toolbox 能够显示正确的类型时...
有什么办法可以改善吗?
SQLite Toolbox 使用 System.Data.Sqlite,它处理数据类型的方式与 Microsoft.Data.Sqlite(EF Core 使用的)完全不同