.net - Entity Framework lagrer ikke dataindtastninger i databasen

Indlæg af Hanne Mølgaard Plasc

Problem



Først skal jeg nævne, at dette problem kun forekommer i Windows-formularapplikationer, og det samme program i webtilstand, for eksempel med MVC3, fungerer perfekt.


For nogle dage siden skrev jeg et meget simpelt Windows-formularprogram ved hjælp af Visual Studio 2010 Ultimate med en SQL Express-database. Jeg tilføjede databasen ved at vælge Tilføj> Nyt element> Servicebaseret database og en enhedsdata-model baseret på denne database på samme måde. Jeg brugte Entity ramme til at tilføje nogle nye poster til tabeller. Jeg havde gjort sådan med VS 2008 SP1 før uden problem, så jeg gjorde det samme. Programmet kompilerede og løb uden fejl og jeg indtastede nogle nye data. Efter at have afladt programmet kom jeg tilbage til databasen og intet var sket. Ingen af ​​de oplysninger, jeg havde indtastet, var blevet reddet.
Jeg debugger programmet trin for trin, og alting var okay.
Koden nedenfor er relateret til et meget simpelt program med nævnte problem. Database har et bord (bog):


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


Jeg vil være meget taknemmelig, hvis nogen hjælper mig. Tak på forhånd.


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


Efter redigering:


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

Bedste reference


Endelig efter mange søgninger og spørger fandt jeg løsningen i MSDN fora takket være Patrice Scribe
Du kan se det
her [5]

Andre referencer 1


Prøv dette:


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





Jeg har denne kode i et klassebibliotek (min DAL) i produktion, og det virker fint:


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


bemærk at jeg faktisk ikke tildeler PK ( DataId ), fordi den vil blive tildelt af databasen, jeg returnerer den til opkalderen, så hvem der har påberåbt gemme-metoden, kender det auto genererede ID, hvis det har brug for det.