2014-01-02 1 views
3

Я попытался выполнить несколько различных учебников, чтобы сохранить обновленную дату в моей базе данных SQL, но каждый из них не может сохранить и каждый из них дает разные ошибки , поэтому я полностью потеряю то, как я должен обновлять данные. Это то, что я пытался и ошибки я получаю:Не удалось сохранить изменения в базе данных через Entity Framework 6, попробовали несколько разных тотализаторов, но никто не работает

http://msdn.microsoft.com/en-us/library/dd756368.aspxcontext.UpdateObject не существует

http://www.asp.net/mvc/tutorials/mvc-5/introduction/examining-the-edit-methods-and-edit-view Дайте ошибку

System.Data.Entity.Core.OptimisticConcurrencyException : Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

http://www.dotnetcurry.com/showarticle.aspx?ID=619 дать мне ошибку:

Sequence contains no elements

Так Я в недоумении, как то, что я должен сделать, чтобы обновить эту дату. Вот два кодовых блоков я пытался:

[Route("Edit"), HttpPost, ValidateAntiForgeryToken] 
public ActionResult EditSection([Bind(Include = "ID, RouteName, Type, Title, Synopsis")] Section section, HttpPostedFileBase Logo) 
{ 
    SectionAddEditVM model = new SectionAddEditVM { Section = section }; 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      using (db) 
      { 
       var SectionUpdate = (from s in db.Sections 
            where s.ID == section.ID 
            select s).First(); 
       SectionUpdate.RouteName = section.RouteName; 
       SectionUpdate.Type = section.Type; 
       SectionUpdate.Title = section.Title; 
       SectionUpdate.Synopsis = section.Synopsis; 

       db.SaveChanges(); 
      } 
     } 
     catch (Exception ex) 
     { 
      ErrorSignal.FromCurrentContext().Raise(ex); 
      ModelState.AddModelError("Processing Error", "There was a problem processing the change, please try again later."); 
      return View(model); 
     } 
    } 
    return View(model); 
} 

И

[Route("Edit"), HttpPost, ValidateAntiForgeryToken] 
public ActionResult EditSection([Bind(Include = "ID, RouteName, Type, Title, Synopsis")] Section section, HttpPostedFileBase Logo) 
{ 
    SectionAddEditVM model = new SectionAddEditVM { Section = section }; 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      using (db) 
      { 
       db.Entry(section).State = EntityState.Modified; 
       db.SaveChanges(); 
      } 
     } 
     catch (Exception ex) 
     { 
      ErrorSignal.FromCurrentContext().Raise(ex); 
      ModelState.AddModelError("Processing Error", "There was a problem processing the change, please try again later."); 
      return View(model); 
     } 
    } 
    return View(model); 
} 

около 200 строк выше коды редактирования я объявившая своей db собственности, используя private SectionContext db = new SectionContext(); и он используется без каких-либо проблем, чтобы добавить новые данные на сервер и получать данные с этого сервера.

+1

На строках, которые читают 'using (db)', то есть вы обычно создаете контекст базы данных, например, 'using (var db = new YourDatabaseEntities())'. Я удивлен, что вы не получаете «NullReferenceException» при попытке использовать переменную 'db' после этого. Где определяется и инициализируется переменная/поле 'db'? – Steve

+0

К сожалению, я должен был упомянуть, что DB инициализируется около 200 строк в контроллере и используется без проблем при сохранении новых данных и получении существующих данных. – Matthew

+0

Если вы инициализируете переменную db в другом месте, вы не должны использовать ее в инструкции using(). использование закроет ваше соединение db. – LeffeBrune

ответ

2

Решение только что пришло ко мне, я понял, что на моем представлении не было ввода, содержащего идентификатор редактируемого раздела, поэтому, когда он пытается проверить БД, у него нет данных для сравнения с первичным ключом. Я просто добавил: @Html.HiddenFor(m => m.Section.ID) и теперь все это работает с помощью:

using (db) 
{ 
    db.Entry(section).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

Я почти уверен, что идентификатор является частью вашего URL. Если это так, все, что вам нужно сделать, это иметь «int? id' среди ваших параметров метода. –

+1

Вы по-прежнему используете 'using' неправильно. Когда блок выходит, 'db.Dispose()' автоматически вызывается во время выполнения. Это * будет * закрыть ваше соединение. Если вам случится повторная инициализация его где-то еще между каждым использованием, это будет вонючий ... Вы должны инициализировать его в инструкции 'using'. – Steve

+0

Я не понимаю, в чем проблема, можете ли вы быть более конкретным в отношении того, что я делаю, тогда «вонючий»? – Matthew

2

У меня была такая же проблема, и добавив его в моей форме ввода:

@Html.HiddenFor(m => m.SectionID, model.SectionID) 

Наряду с добавлением к Bind в контроллере:

[HttpPost] 
public ActionResult Edit([Bind(Include = "SectionID, SectionName, Note")]Section sectionObject) 
{ 
    ... 
-4

проблема, которую Стив испытывает с вашими:

using(db) 
    { 
    // Do something with the connection 
    ... 
    } 

- то, что вы должны инициализировать db при использовании. Например, если вы хотите использовать данные из файла:

using (StreamReader sr = new StreamReader(uploadedFile.InputStream)) 
    { 
    // Do something with the connection 
    string line = sr.ReadLine(); 
    ... 
    } 

Таким образом, когда вы выпасть из цикла StreamReader закрывается.

-2

Вот мое конкретное решение, я использую EF 6.xx с Sql Server и таблицами Я пытаюсь вставить в имеет ВМЕСТО триггера что перепуталось команда TSQL, посланное приложением, с Профайлер SQL Server нашел следующую команду.

Также имейте в виду RowId - это имя столбца Identity Column на таблице.

EXEC sp_executesql 
    N'INSERT dbo.TableName(a, b, c, d, e, f, g, h, i) 
     VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8) 
     SELECT RowId 
     FROM dbo.TableName 
     WHERE @@ROWCOUNT > 0 AND RowId = scope_identity()', 
       N'@0 bigint,@1 decimal(8,3),@2 decimal(8,3),@3 varchar(50), 
       @4 varchar(80), @5 decimal(11,2),@6 datetime2(7), 
       @7 datetime2(7),@8 decimal(8,3)', 
@0 = 1, @1 = 2, @2 = 3, @3 = 'a', @4 = 'b', @5 = 4, @6 = 'date', @7 = 'date', @8 = 5; 

Это было возвращение 0 записей, которые вызвали эту проблему ... так что мое исправление было изменить триггер, добавив следующее Select заявления триггера, сразу после заявления вставки.

SELECT 
    RowId 
FROM 
    TableName 
WHERE 
@@ROWCOUNT > 0 AND 
RowId= SCOPE_IDENTITY() 

Надеется, что это помогает кто-то еще, так как я был по пути VStudio и мое решение было на стороне БД.