Entity Framework Core 3.1 не генерирует правильные типы данных для свойств сущностей из таблицы SQLite - PullRequest
0 голосов
/ 22 марта 2020

Я создаю таблицу SQLite из сценария, используя SQL Типы данных сервера:

(
   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 исчезла, и int был преобразован в bigint для ключевых столбцов ... ОК, это не проблема.

Но когда я генерирую dbcontext и сущности с помощью утилиты scaffold-dbcontext EF Core 3.1, вот код, сгенерированный для сущности 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 были заменены на long вместо short
  • uniqueidentifier был изменен на byte [] вместо Guid
  • деньги были заменены на byte [] вместо десятичного
  • бит был заменен на byte [] вместо bool

Я удивлен таким поведением. Почему EF Core не может генерировать правильные типы данных? Когда SQLite Toolbox способен отображать нужные типы ...

Есть ли способ улучшить это?

1 Ответ

0 голосов
/ 23 марта 2020

SQLite Toolbox использует System.Data.Sqlite, который обрабатывает типы данных совершенно иначе, чем Microsoft.Data.Sqlite (который используется EF Core)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...