实体框架6,无法添加新条目

时间:2015-07-30 17:47:32

标签: c# entity-framework wcf entity-framework-6

我在.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

使用这些参数:

  • @ 0:' 1' (Type = Int32)
  • @ 1:' 30/07/2015 18:50:02' (Type = DateTime2)
  • @ 2:' 1786' (Type = Int32)
  • @ 3:' coucou' (Type = AnsiString,Size = 300)
  • @ 4:' 2' (Type = Int32)

以我自己的方式执行,并且好好开心:

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

仍然不明白

1 个答案:

答案 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}}由于文化差异。