Fügen Sie Daten mit dem Entity Framework-Modell ein


88

Ich versuche, einige Daten mithilfe des Entity Framework-Modells in meine Datenbank einzufügen, aber aus unbekannten Gründen führt dies zu nichts.

Vermisse ich hier etwas?

using (var context = new DatabaseEntities())
{
    var t = new test
    {
        ID = Guid.NewGuid(),
        name = "blah",
    };
    context.AddTotest(t);
    context.SaveChanges();
}

Versuchen Sie 'SaveChanges (System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);'
Willem

5
Code zuerst? Modell zuerst? Bricht es oder speichert es einfach nichts? Was sagt SQL Profiler? Wird überhaupt etwas an die Datenbank gesendet?
Dennis Traub

Antworten:


115

Es sollte sein:

context.TableName.AddObject(TableEntityInstance);

Wo:

  1. TableName: Der Name der Tabelle in der Datenbank.
  2. TableEntityInstance: Eine Instanz der Tabellenentitätsklasse.

Wenn Ihr Tisch ist Orders, dann:

Order order = new Order();
context.Orders.AddObject(order);

Beispielsweise:

 var id = Guid.NewGuid();

 // insert
 using (var db = new EfContext("name=EfSample"))
 {
    var customers = db.Set<Customer>();
    customers.Add( new Customer { CustomerId = id, Name = "John Doe" } );

    db.SaveChanges();
 }

Hier ist ein Live-Beispiel:

public void UpdatePlayerScreen(byte[] imageBytes, string installationKey)
{
  var player = (from p in this.ObjectContext.Players where p.InstallationKey == installationKey select p).FirstOrDefault();

  var current = (from d in this.ObjectContext.Screenshots where d.PlayerID == player.ID select d).FirstOrDefault();

  if (current != null)
  {
    current.Screen = imageBytes;
    current.Refreshed = DateTime.Now;

    this.ObjectContext.SaveChanges();
  }
  else
  {
    Screenshot screenshot = new Screenshot();

    screenshot.ID = Guid.NewGuid();
    screenshot.Interval = 1000;
    screenshot.IsTurnedOn = true;
    screenshot.PlayerID = player.ID;
    screenshot.Refreshed = DateTime.Now;
    screenshot.Screen = imageBytes;

    this.ObjectContext.Screenshots.AddObject(screenshot);
    this.ObjectContext.SaveChanges();
  }
}

1
Ich habe keine AddObject-Methode.
Rocshy

@ Tennis Traub hat dich nach deinem Model gefragt. Bitte geben Sie weitere Informationen dazu.
Entwickler

28
Verwenden Sie .Add anstelle von .AddObject
Dale Fraser

9
Auf EF 6 würden Sie .Add anstelle von .AddObject
David

1
Fantastische Antwort!
Vielen

40
var context = new DatabaseEntities();

var t = new test //Make sure you have a table called test in DB
{
    ID = Guid.NewGuid(),
    name = "blah",
};

context.test.Add(t);
context.SaveChanges();

Sollte es tun


7

[HttpPost] // wird verwendet, wenn Sie Logik für ein Schaltflächenklickereignis schreiben

public ActionResult DemoInsert(EmployeeModel emp)
{
    Employee emptbl = new Employee();    // make object of table
    emptbl.EmpName = emp.EmpName;
    emptbl.EmpAddress = emp.EmpAddress;  // add if any field you want insert
    dbc.Employees.Add(emptbl);           // pass the table object 
    dbc.SaveChanges();

    return View();
}

Wenn Sie Fragen haben, fragen Sie mich
Sanket Parikh

3

Ich benutze EF6 und finde etwas Seltsames.

Angenommen, der Kunde hat einen Konstruktor mit Parameter.

wenn ich benutze new Customer(id, "name")und tue

 using (var db = new EfContext("name=EfSample"))
 {
    db.Customers.Add( new Customer(id, "name") );
    db.SaveChanges();
 }

Es läuft fehlerfrei durch, aber wenn ich in die Datenbank schaue, stelle ich tatsächlich fest, dass die Daten NICHT eingefügt werden.

Aber wenn ich die geschweiften Klammern hinzufüge, benutze new Customer(id, "name"){}und mache

 using (var db = new EfContext("name=EfSample"))
 {
    db.Customers.Add( new Customer(id, "name"){} );
    db.SaveChanges();
 }

Die Daten werden dann tatsächlich eingefügt.

Anscheinend machen die geschweiften Klammern den Unterschied. Ich denke, dass das Entity Framework nur beim Hinzufügen von geschweiften Klammern erkennt, dass es sich um echte konkrete Daten handelt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.