LINQ转换"0"插入到NULL
本文关键字:quot NULL 插入 LINQ 转换 | 更新日期: 2023-09-27 18:09:28
当用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();
其中sid
和prrevision
为主键。
日志输出:
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
sid
和0
prrevision
。如何解决这个问题?
从日志看来,"sid"answers" prerevision "字段不包括在INSERT语句中。如果你在你的实体中将这些字段标记为复合主键([Key]作为annotation或HasKey()在fluent中),EF将不会将这些字段发送到你的数据库,并认为它们是自动生成的。
你可以通过设置
告诉EF不要认为它们是自动生成的[DatabaseGenerated(DatabaseGenerationOption.None)]