Insira dados usando o modelo Entity Framework


88

Estou tentando inserir alguns dados em meu banco de dados usando o modelo Entity Framework, mas por alguns motivos desconhecidos para mim, isso não faz nada.

Estou faltando alguma coisa aqui?

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

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

5
Código primeiro? Modelar primeiro? Ele quebra ou simplesmente não armazena nada? O que o SQL Profiler diz? Existe alguma coisa sendo enviada para o banco de dados?
Dennis Traub

Respostas:


115

Deveria ser:

context.TableName.AddObject(TableEntityInstance);

Onde:

  1. TableName: o nome da tabela no banco de dados.
  2. TableEntityInstance: uma instância da classe de entidade da tabela.

Se sua mesa for Orders, então:

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

Por exemplo:

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

Aqui está um exemplo ao 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
Eu não tenho nenhum método AddObject.
Rocshy

@Dennis Traub perguntou sobre sua modelo. Por favor, forneça mais informações sobre isso.
Desenvolvedor

29
Use .Add em vez de .AddObject
Dale Fraser

9
No EF 6, você usaria .Add em vez de .AddObject
David

1
Resposta fantástica! obrigado por isso, pois mostra como ler e escrever usando a estrutura de entidade
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();

Deveria fazer isso


7

[HttpPost] // ele usa quando você escreve lógica no evento de clique de botão

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 houver qualquer dúvida, pergunte-me
sanket parikh

3

Estou usando EF6 e acho algo estranho,

Suponha que o cliente tenha um construtor com parâmetro,

se eu uso new Customer(id, "name")e faço

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

Ele é executado sem erros, mas quando eu olho no DataBase, descubro que os dados NÃO foram inseridos,

Mas se eu adicionar as chaves, use new Customer(id, "name"){}e faça

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

os dados serão realmente inseridos,

Parece que os Curly Brackets fazem a diferença, acho que apenas quando adicionar Curly Brackets, o framework da entidade reconhecerá que se trata de um dado concreto real.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.