5

Na początku powinienem wspomnieć, że problem ten występuje tylko w aplikacjach formularzy Windows i ten sam program w trybie webowym, na przykład z MVC3 działa idealnie.Struktura encji nie zapisuje wpisów danych w bazie danych

Kilka dni temu napisałem bardzo prosty program do tworzenia formularzy w oknach przy użyciu Visual Studio 2010 ultimate z bazą danych SQL Express. Dodałem bazę danych wybierając opcję Dodaj> Nowy element> Baza danych oparta na usługach i model danych jednostki oparty na tej bazie danych w ten sam sposób. Użyłem struktury Entity do dodawania nowych rekordów do tabel. Zrobiłem coś takiego z VS 2008 SP1, zanim nie miałem problemu, więc zrobiłem to samo. Program został skompilowany i uruchomiony bez błędów i wprowadziłem kilka nowych danych. po wyjściu z programu wróciłem do bazy danych i nic się nie stało. Żadna z informacji, które wprowadziłem, nie została zapisana. I debugowania programu krok po kroku i wszystko było w porządku. Poniższy kod dotyczy bardzo prostego programu z wymienionym problemem. Baza danych zawiera jedną tabelę (książka):

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 

Będę bardzo wdzięczny, jeśli ktoś może mi pomóc. Z góry dziękuję.

.................

Po edycji:

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     //BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      var db = new BookDatabaseEntities(); 
      var bookToCreate = db.Books.CreateObject(); 

      //Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.AcceptAllChanges(); 
      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 
+0

spróbować zastąpić patrz „nowych db.Books();” z "db.Books.CreateObject();" –

+0

Upewnij się, że sprawdzasz poprawną bazę danych. –

+0

@Davide: Użyłem CreateObject tak jak powiedziałeś, ale problem nadal istnieje. – Monoloox

Odpowiedz

4

Wreszcie po wielu poszukiwaniach i prosząc znalazłem rozwiązanie w MSDN forów dzięki Patrice Scribe Można go here

+0

Dzięki Monoloox. Po długich poszukiwaniach w końcu otrzymałem odpowiedź od Ciebie. –

1

Spróbuj tego:

db.Attach(bookToCreate); 
db.SaveChanges(); 

Edit:

Mam ten kod w bibliotece klas (mój DAL) w produkcji i działa dobrze:

using (var dbContext = new DbEntities()) 
    { 
     var job = dbContext.RiskToolJob.CreateObject(); 

     job.AnalysisDataID = analysisDataID; 

     job.JobRmsAnalysisID = RMSAnalysisID; 
     job.UserName = userName; 

     job.JobCreated = DateTime.UtcNow; 

     dbContext.RiskToolJob.AddObject(job); 

     dbContext.SaveChanges(); 

     return job.DataId; 
    } 

zauważyć, że w rzeczywistości nie przypisać PK (DataId), ponieważ zostanie on przydzielony przez bazę danych, i zwrócić go do rozmówcy tak, który wywołał metodę zapisywania poznaje automatycznie generowane ID, w razie potrzeby.

+0

Drogi Davide ... Zrobiłem to, co powiedziałeś, ale wynik jest wciąż taki sam. Myślę, że problem dotyczy metody SaveChanges(), ponieważ po wykonaniu (db.Books.AddObject) lub (db.Books.Attach) obiekt został dodany do ObjectStateManager i wygląda na to, że SaveChanges nie może go zapisać w bazie danych. Jednak nie zgłasza żadnego błędu podczas procesu wprowadzania. – Monoloox

+0

Jeszcze jedno ... Jak już pisałem, kiedy piszę ten sam kod w formularzu internetowym lub MVC, działa bez tego problemu. Zdarza się tylko w oknach z aplikacjami i nie wiem dlaczego. – Monoloox

+0

Davide dlaczego miałby db.Attach pomóc? Z dokumentacji MS - "db.Attach służy do ponownego zaludnienia kontekstu z jednostką, o której wiadomo, że już istnieje w bazie danych. SaveChanges nie będzie więc próbował wstawić dołączonej jednostki do bazy danych, ponieważ zakłada się, że już tam jest" – Izzy