Insertar datos usando el modelo de Entity Framework


89

Estoy tratando de insertar algunos datos en mi base de datos usando el modelo Entity Framework, pero por algunas razones desconocidas para mí, no hace nada.

¿Me estoy perdiendo de algo?

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

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

6
Código primero? ¿Modelo primero? ¿Se rompe o simplemente no almacena nada? ¿Qué dice SQL Profiler? ¿Se está enviando algo a la base de datos?
Dennis Traub

Respuestas:


117

Debería ser:

context.TableName.AddObject(TableEntityInstance);

Dónde:

  1. TableName: el nombre de la tabla en la base de datos.
  2. TableEntityInstance: una instancia de la clase de entidad de tabla.

Si su mesa es Orders, entonces:

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

Por ejemplo:

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

Aquí hay un ejemplo en 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
No tengo ningún método AddObject.
Rocshy

@Dennis Traub le preguntó sobre su modelo. Proporcione más información al respecto.
DmitryBoyko

29
Use .Add en lugar de .AddObject
Dale Fraser

9
En EF 6, usaría .Add en lugar de .AddObject
David

1
¡Respuesta fantástica! gracias por esto, ya que muestra cómo leer y escribir usando el marco de la entidad
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();

Deberías hacerlo


7

[HttpPost] // se usa cuando escribe lógica en el evento de clic de botón

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

si alguna consulta me preguntan
sanket parikh

3

Estoy usando EF6 y encuentro algo extraño,

Supongamos que el cliente tiene un constructor con parámetro,

si lo uso new Customer(id, "name")y lo hago

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

Se ejecuta sin errores, pero cuando miro en la base de datos, encuentro de hecho que los datos NO se insertan,

Pero si agrego las llaves, use new Customer(id, "name"){}y haga

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

entonces los datos se insertarán realmente,

Parece que los Curly Brackets marcan la diferencia, supongo que solo cuando agregue Curly Brackets, el marco de la entidad reconocerá que se trata de un dato concreto real.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.