Вставте дані за допомогою моделі Entity Framework


89

Я намагаюся вставити деякі дані в свою базу даних за допомогою моделі Entity Framework, але з якихось невідомих мені причин це нічого не робить.

Мені чогось тут не вистачає?

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

Спробуйте 'SaveChanges (System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);'
Віллем

6
Код перший? Спершу модель? Він ламається чи просто нічого не зберігає? Що говорить SQL Profiler? Чи взагалі щось надсилається до бази даних?
Денніс Трауб,

Відповіді:


117

Вона повинна бути:

context.TableName.AddObject(TableEntityInstance);

Де:

  1. TableName: ім'я таблиці в базі даних.
  2. TableEntityInstance: екземпляр класу сутності таблиці.

Якщо ваш стіл є Orders, то:

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

Наприклад:

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

Ось живий приклад:

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
У мене немає методу AddObject.
Рокші

@Dennis Traub запитав вас про вашу модель. Будь ласка, надайте більше інформації про це.
Дмитро Бойко

29
Використовуйте .Add, а не .AddObject
Дейл Фрейзер

9
На EF 6 ви б використовували .Add, а не .AddObject
Девід

1
Фантастична відповідь! спасибі за це, оскільки це показує, як читати і писати за допомогою сутності фреймворку
Стівен Пефаніс,

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

Повинен це зробити


7

[HttpPost] // він використовується, коли ви пишете логіку для події натискання кнопки

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

3

Я використовую EF6, і мені здається щось дивне,

Припустимо, що у Замовника є конструктор із параметром,

якщо я використовую new Customer(id, "name"), і роблю

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

Він проходить без помилок, але коли я заглядаю в базу даних, я виявляю, що дані НЕ ВСТАВЛЯЮТЬСЯ,

Але якщо я додаю фігурні дужки, використовуй new Customer(id, "name"){}і роби

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

дані фактично будуть ВСТАНОВЛЕНІ,

здається, фігурні дужки роблять різницю, я думаю, що лише додавши фігурні дужки, фреймворк сутності визнає, що це справжні конкретні дані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.