LINQ在insert中将“0”转换为NULL

时间:2013-04-16 05:55:15

标签: c# sql linq

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

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。该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

您可以通过设置

告诉EF不要将它们视为自动生成
[DatabaseGenerated(DatabaseGenerationOption.None)]

在两个关键字段上。