我正在编写一个程序,将智能手机中的短信存储在数据库中。
我在MySQL数据库中创建了一个表,如下所示:
CREATE TABLE
sms
(
smsID
int(11)NOT NULL AUTO_INCREMENT,messageDate
datetime NOT NULL,
text
varchar(1000)DEFAULT NULL,
number
varchar(45)DEFAULT NULL,
senderID
int(11)DEFAULT' 0',
taskID
int(11)DEFAULT' 0',messageType
int(11)DEFAULT' 0',{{1} } bit(1)NOT NULL默认b' 0',
主要键(hasReply
),
键smsID
(date
)
)ENGINE = InnoDB AUTO_INCREMENT = 54 DEFAULT CHARSET = utf8;
我使用以下代码在C#中创建和存储传入文本消息的新对象:
messageDate
所有数据都正确存储,但DbContext db = new DbContext();
var message = new sms();
message.taskID = taskID;
message.senderID = senderID;
message.messageDate = this.MessageDate;
message.number = this.Number;
message.text = this.Text;
message.messageType = MessageTypes.TYPE_INBOUND;
DebugLog.Log("Storing message with datetime: " +
message.messageDate?.ToLongTimeString());
db.sms.Add(message);
db.SaveChangesAsync();
字段(我已仔细检查过:在调用messageDate
时不是null
)除外。它始终存储为&00; 00-00-0000 00:00'或者如果在DB表中设置了默认日期,则设置默认日期。
当我们查看来自EF-log的生成的查询时,这是有意义的:
使用datetime存储消息:11:37:29
在20.09.2017 11:37:28 +02:00开启连接在20.09.2017 11:37:28 +02开始交易: 00
SET SESSION sql_mode =' ANSI&#39 ;; INSERT INTOSaveChangesAsync
(
sms
,text
,
number
,senderID
,
taskID
,
messageType
)VALUES(
@ gp1,< br /> @ gp2,
1227,
122138,
1,
0);
选择
hasReply
,
smsID
FROMmessageDate
WHERE row_count()&gt; 0和sms
= last_insert_id()
- @ gp1:&#39;某些文字&#39; (Type = String,IsNullable = false,Size = 5)
- @ gp2:&#39; HIDDEN NUMBER&#39; (Type = String,IsNullable = false,Size = 14)
- 执行时间为20.09.2017 11:37:28 +02:00
- 在1 ms内完成,结果为:EFMySqlDataReader
承诺交易于20.09.2017 11:37:28 +02:00在2016年6月20日上午11:37:28 + 02:00封闭连接。交易于20.09.2017 11 :37:28 +02:00
似乎在插入后从数据库中查询了相关字段,就像AUTO_INCREMENT smsID
一样。不知道为什么。
这真让我感到烦恼,因为我不想插入当前时间,但是消息到达的实际时间,我似乎无法找到解决方案。
任何提示都会很棒!提前致谢。 :)
答案 0 :(得分:0)
Fluent API或Data Annotations中定义的messageDate属性是什么? Type是否设置为datetime?它未设置为在此日期时间字段中使用自动增量键,对吗?
我会检查messageDate是否是您密钥的一部分。我还要检查[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性是否通过Data Annotations或Fluent API应用于messageDate属性。
答案 1 :(得分:0)
感谢Daniel Lorenz的评论。
他提到日期时间字段我是密钥的一部分。 好吧,我在数据库中为它创建了一个索引,然后在Visual Studio(数据库优先)中生成模型。
解决此问题(不是一种解决方案):
突然正确生成查询,并正确存储日期。
这对我来说感觉像个错误,但我很高兴它现在有效;)