Wstaw dane przy użyciu modelu Entity Framework

89

Próbuję wstawić dane do mojej bazy danych za pomocą modelu Entity Framework, ale z nieznanych mi powodów nic to nie robi.

Czy coś mi umyka?

using (var context = new DatabaseEntities())
{
    var t = new test
    {
        ID = Guid.NewGuid(),
        name = "blah",
    };
    context.AddTotest(t);
    context.SaveChanges();
}
Rocshy
źródło
Spróbuj 'SaveChanges (System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);'
Willem
6
Code First? Model pierwszy? Czy się psuje, czy po prostu nic nie przechowuje? Co mówi SQL Profiler? Czy w ogóle coś jest wysyłane do bazy danych?
Dennis Traub

Odpowiedzi:

117

Powinno być:

context.TableName.AddObject(TableEntityInstance);

Gdzie:

  1. TableName: nazwa tabeli w bazie danych.
  2. TableEntityInstance: instancja klasy jednostki tabeli.

Jeśli Twój stół jest Orders, to:

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

Na przykład:

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

Oto przykład na żywo:

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();
  }
}
DmitryBoyko
źródło
1
Nie mam żadnej metody AddObject.
Rocshy
@Dennis Traub zapytał Cię o Twój Model. Podaj więcej informacji na ten temat.
DmitryBoyko
29
Użyj .Add zamiast .AddObject
Dale Fraser
9
W EF 6 użyłbyś .Add zamiast .AddObject
David
1
Fantastyczna odpowiedź! dzięki za to, ponieważ pokazuje, jak czytać i pisać przy użyciu frameworka encji
Stephen Pefanis
41
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();

Powinienem to zrobić

Nawed Nabi Zada
źródło
7

[HttpPost] // używany podczas zapisywania logiki w przypadku kliknięcia przycisku

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();
}
sanket parikh
źródło
jeśli zapytasz mnie
sanket parikh
3

Używam EF6 i znajduję coś dziwnego,

Załóżmy, że Klient ma konstruktora z parametrem,

jeśli używam new Customer(id, "name")i robię

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

Działa bezbłędnie, ale kiedy zaglądam do bazy danych, okazuje się, że dane NIE SĄ wstawiane,

Ale jeśli dodam nawiasy klamrowe, użyj new Customer(id, "name"){}i zrób

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

dane zostaną wtedy faktycznie wprowadzone,

wydaje się, że nawiasy klamrowe robią różnicę, myślę, że tylko po dodaniu nawiasów klamrowych struktura encji rozpozna, że ​​są to prawdziwe konkretne dane.

yu yang Jian
źródło