我在.Net 4.5 WCF / HTTP应用上使用Entity framework 6.1.3。我在保存新数据方面遇到了一些问题。
我的代码如下:
using (AgpModel model = new AgpModel())
{
Entite.db.commentaire comment = commentaire.toDB();
model.commentaires.Add(comment);
model.SaveChanges();
commentaire.Id = comment.id;
}
AgpModel
是我的上下文,commentaire
是我可以通过WCF序列化的前端模型,comment
是我试图保存的对象。
toDB()
是将commentaire
转换为comment
的方法。
将非常第一个数据添加到表格中时,我在调用SaveChanges()
时遇到例外情况,其中说:
存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540。
我尝试了以下链接中提供的方法,但却有以下异常:
OriginalValues不能用于处于已添加状态的实体。
阅读桌面工作正常。
以下是一些可以帮助您理解的额外代码:
toDB方法:
public db.commentaire toDB()
{
return new db.commentaire() {
id = this.Id,
stagiaire = this.IdStagiaire,
utilisateur = this.IdUtilisateur,
niveau = (int)this.Niveau,
contenu = this.Contenu,
date = this.Date
};
}
评论员课程:
[Table("agp.commentaires")]
public partial class commentaire
{
[Key]
[Column("commentaire", Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int utilisateur { get; set; }
[Key]
[Column("date", Order = 2, TypeName = "smalldatetime")]
public DateTime date { get; set; }
[Key]
[Column(Order = 3)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int stagiaire { get; set; }
[Key]
[Column(Order = 4)]
[StringLength(300)]
public string contenu { get; set; }
[Key]
[Column(Order = 5)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int niveau { get; set; }
public virtual utilisateur utilisateur1 { get; set; }
public virtual Stagiaire Stagiaire1 { get; set; }
}
修改:
传递给sql server 2008的请求:
INSERT [agp].[commentaires]([utilisateur], [date], [stagiaire], [contenu], [niveau]) VALUES (@0, @1, @2, @3, @4)
SELECT [commentaire] FROM [agp].[commentaires] WHERE @@ROWCOUNT > 0 AND [commentaire] = scope_identity() AND [utilisateur] = @0 AND [date] = @1 AND [stagiaire] = @2 AND [contenu] = @3 AND [niveau] = @4
使用这些参数:
以我自己的方式执行,并且好好开心:
DECLARE @0 as INT = 1;
DECLARE @1 AS DateTime2 = '30/07/2015 18:50:02';
DECLARE @2 AS int = 1786;
DECLARE @3 AS nvarchar(300) = 'coucou';
DECLARE @4 AS int = 2;
INSERT [agp].[commentaires]([utilisateur], [date], [stagiaire], [contenu], [niveau])
VALUES (@0, @1, @2, @3, @4)
SELECT [commentaire]
FROM [agp].[commentaires]
WHERE @@ROWCOUNT > 0 AND [commentaire] = scope_identity() AND [utilisateur] = @0 AND [date] = @1 AND [stagiaire] = @2 AND [contenu] = @3 AND [niveau] = @4
仍然不明白
答案 0 :(得分:1)
将PleaseWaitWindow
设置为public DateTime date { get; set; }
,您的数据库显示为期待欧洲日期对象。将通用Column(Typename="smalldatetime")
传递给SQL可能会使DateTime
超出预期的最小/最大允许smalldatetime
值。
我建议为您的会话设置DateTime
,因为您的数据库可能正在指定特定的日期格式。我认为实体框架会在所有情况下都采用接受格式的格式:
CultureInfo enGB = new CultureInfo("en-GB");
但是,您的异常并未指向导致问题的确切列。您的复合键都已正确声明,并且您的YYYYMMDD
YYYY-MM-DDThh:nn:ss[.mmmmmmm]
调用似乎已用数据填充了所有列(尽管您需要设置断点并自行验证)。我能想到的唯一另一件事就是触发该错误是在模型中设置的可接受toDB()
,但是转换为超出{{的最小/最大范围界限的SQL格式1}}由于文化差异。