主键向SQLite表添加记录时出现问题

xienkqul  于 2023-08-06  发布在  SQLite
关注(0)|答案(2)|浏览(154)

我在用

<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.8" />

字符串
我在sqlitestudio中创建一个表:

CREATE TABLE Product 
(
    name      TEXT,
    price     NUMERIC,
    quantity  NUMERIC,
    productId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
);


我将数据库构建成代码

public string? Name { get; set; }
public byte[]? Price { get; set; }
public byte[]? Quantity { get; set; }
public long ProductId { get; set; }


(我似乎必须将PriceQuantity属性修改为decimal等,但它似乎仍然“工作”,所以我们得到)

public string? Name { get; set; }
public decimal? Price { get; set; }
public decimal? Quantity { get; set; }
public long ProductId { get; set; }


然后我有一些代码添加一个新记录

var newProduct = new Product
        {
            Name = "New",
            Price = 0,
            Quantity = 0
        };
await context!.Products.AddAsync(newProduct);


我不能设置主键,因为它是由数据库自动生成的(我以前在ADO.NET和早期版本的SQL Server EF中遇到过这种情况)。
但我得到一个错误:
System.InvalidOperationException:无法跟踪实体类型“Product”的示例,因为已在跟踪'ProductId'}具有相同键值的另一个示例。在附加现有实体时,确保只附加一个具有给定键值的实体示例
是的,我完全明白,我添加了一个主键为0的记录,已经有一个了。
那么我该如何添加数据呢?(我以前用SQL Server做过很多次这样的事情,但不知何故,这从来都不是问题,我错过了一些东西--我找不到)。
目前我唯一的解决方法是为主键生成guid,我总是觉得有点难看。

fdbelqdn

fdbelqdn1#

似乎记录id的自动生成没有增加新记录示例。也许可以检查一下设置。
或者尝试添加记录,并在代码中包含下一个id值的id,看看是否有效。

jaxagkaj

jaxagkaj2#

老实说,我放弃了这一点,只是做了一个代码优先的实现,这似乎是开箱即用的。
出于某种原因,数据库优先的方法在OnModelCreating中创建了描述数据库的代码日志,而代码优先的方法没有做到这一点,但它似乎是神奇地工作。
我更喜欢数据库第一,对我来说,他们是两个不同的东西,我想知道是否有一个错误,在数据库第一的方法(它总是为我工作与sql server)。
我会先坚持写代码,也许有一天会再试一次。

相关问题