Inserisci i dati usando il modello Entity Framework


88

Sto cercando di inserire alcuni dati nel mio database utilizzando il modello Entity Framework, ma per alcuni motivi sconosciuti a me, non fa nulla.

Mi manca qualcosa qui?

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

Prova "SaveChanges (System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);"
Willem

5
Code First? Primo modello? Si rompe o semplicemente non immagazzina nulla? Cosa dice SQL Profiler? C'è qualcosa che viene inviato al database?
Dennis Traub

Risposte:


115

Dovrebbe essere:

context.TableName.AddObject(TableEntityInstance);

Dove:

  1. TableName: il nome della tabella nel database.
  2. TableEntityInstance: un'istanza della classe entità tabella.

Se il tuo tavolo lo è Orders, allora:

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

Per esempio:

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

Ecco un esempio dal vivo:

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
Non ho alcun metodo AddObject.
Rocshy

@Dennis Traub ti ha chiesto del tuo modello. Si prega di fornire maggiori informazioni a riguardo.
Sviluppatore

29
Usa .Add anziché .AddObject
Dale Fraser

9
Su EF 6, useresti .Add anziché .AddObject
David

1
Risposta fantastica! grazie per questo in quanto mostra come leggere e scrivere utilizzando il framework delle entità
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();

Dovrebbe farlo


7

[HttpPost] // viene utilizzato quando scrivi la logica sull'evento clic del pulsante

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

se qualsiasi domanda mi chieda
sanket parikh

3

Sto usando EF6 e trovo qualcosa di strano,

Supponiamo che il cliente abbia un costruttore con parametro,

se uso new Customer(id, "name"), e lo faccio

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

Funziona senza errori, ma quando guardo nel DataBase, trovo in effetti che i dati NON sono stati inseriti,

Ma se aggiungo le parentesi graffe, usa new Customer(id, "name"){}e fai

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

i dati verranno quindi effettivamente inseriti,

sembra che le parentesi graffe facciano la differenza, immagino che solo quando si aggiungono le parentesi graffe, il framework dell'entità riconoscerà che si tratta di un dato concreto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.