2015-07-30 2 views
0

Я использую инфраструктуру Entity 6.1.3 в приложении .NET .NET WCF/HTTP. У меня проблемы с сохранением новых данных.Entity Framework 6, не может добавить новую запись

мой код выглядит следующим образом:

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 
    }; 
} 

Commentaire класс:

[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; } 
} 

Edit:

запрос передан на сервер sql 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' (тип = datetime2)
  • @ 2: '1786' (тип = Int32)
  • @ 3: 'Coucou' (тип = AnsiString, размер = 300)
  • @ 4: '2' (тип = Int32)

Выполненный по себе этот путь и waorks нормально:

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

С вашим public DateTime date { get; set; } набор для Column(Typename="smalldatetime") и база данных появляясь ожидать европейский объект даты. Возможно, передача общего DateTime в SQL дает smalldatetime, который выходит за пределы ожидаемых значений минимального/максимального допустимых значений DateTime.

Я предлагаю установить CultureInfo enGB = new CultureInfo("en-GB"); для вашей сессии, поскольку, как представляется, ваша база данных может указывать определенный формат даты. Я бы предположил, что Entity Framework поставит формат в формат, понимаемый во всех случаях:

YYYYMMDD 
YYYY-MM-DDThh:nn:ss[.mmmmmmm] 

Однако, ваше исключение не указывает на точную колонку вызывает проблему. Ваши составные клавиши объявлены правильно, и ваш вызов toDB(), кажется, заполнил все столбцы данными (хотя вам нужно установить контрольную точку и проверить ее сами). Единственное, что я могу придумать, это может привести к тому, что допустимая ошибка DateTime будет установлена ​​в вашей модели, но будет преобразована в формат SQL, который выходит за пределы диапазона min/max для smalldatetime из-за разницы в культуре.

Смежные вопросы