c# - LINQ 在插入中将 "0"转换为 NULL

标签 c# sql linq

使用 LINQ 插入数据库行时,0(作为 int)会转换为 NULL 并且不会显示在插入语句:

DatabaseCAMAE db = new DatabaseCAMAE(Database.Instance.Connection);
db.Log = Console.Out;
camaeprotocol cpr = new camaeprotocol
{
    sid = 0,
    prrevision = 0,
    ataction = "Scan created",
    prdescription = "Scan created",
    prtimestamp = DateTime.Now,
    uid = 0
};
db.camaeprotocol.InsertOnSubmit(cpr);
db.SubmitChanges();

其中 sidprrevision 是主键。
日志输出:

INSERT INTO "main"."camae_protocol"  
   ("at_action", "pr_description", "pr_timestamp", "u_id") 
VALUES (:ataction, :prdescription, :prtimestamp, :uid)
-- :ataction: Input String (Size = 0; Prec = 0; Scale = 0) [Scan created]
-- :prdescription: Input String (Size = 0; Prec = 0; Scale = 0) [Scan created]
-- :prtimestamp: Input DateTime (Size = 0; Prec = 0; Scale = 0) [16.04.2013 07:52:44]
-- :uid: Input Int32 (Size = 0; Prec = 0; Scale = 0) [0]
-- Context: SQLite Model: AttributedMetaModel Build: 0.20.0.0

并且抛出异常(违反约束),因为 LINQ 不会尝试插入 0 sid0 prrevision 。如何解决这个问题?

最佳答案

从日志来看,INSERT 语句中似乎不包含“sid”和“prrevision”字段。如果您将实体中的这些字段标记为复合主键([Key] 作为注释或 Fluent 中的 HasKey()),EF 不会将这些字段发送到您的数据库,并假定它们是自动生成的。

您可以通过设置告诉 EF 不要将它们视为自动生成的

[DatabaseGenerated(DatabaseGenerationOption.None)]

在两个关键字段上。

关于c# - LINQ 在插入中将 "0"转换为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029732/

相关文章:

c# - 为相同的小写和大写字符串创建不同的 GUID

c# - 混合使用 Task 和 Dispatcher 会停止任务

c# - Linq2SQL 多列过滤器

mysql - 从现有表创建多对多关系

mysql - 使用 MySQL Workbench 修改数据库架构

c# - Linq where子句问题

c# - Entity Framework AsNoTracking 中断对 Distinct 的调用

c# - UWP 如何制作运动动画?

c# - App_Data没有访问权限

php - 无法插入 SQL 表或显示全部来自