แทรกข้อมูลโดยใช้แบบจำลอง Entity Framework


90

ฉันกำลังพยายามแทรกข้อมูลบางส่วนในฐานข้อมูลโดยใช้โมเดล 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);'
Willem

6
รหัสแรก? รุ่นแรก? มันแตกหรือไม่เก็บอะไรเลย? SQL Profiler พูดว่าอะไร? มีอะไรถูกส่งไปยังฐานข้อมูลหรือไม่?
Dennis Traub

คำตอบ:


118

มันควรจะเป็น:

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
Rocshy

@ Dennis Traub ถามคุณเกี่ยวกับ Model ของคุณ โปรดให้ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
DmitryBoyko

29
ใช้. Add แทน .AddObject
Dale Fraser

9
ใน EF 6 คุณจะใช้. Add แทน .AddObject
David

1
คำตอบสุดวิเศษ! ขอบคุณสำหรับสิ่งนี้เนื่องจากแสดงวิธีการอ่านและเขียนโดยใช้กรอบเอนทิตี
Stephen Pefanis


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

มันทำงานโดยไม่มีข้อผิดพลาด แต่เมื่อฉันดูใน DataBase ฉันพบว่าข้อมูลไม่ได้ถูกแทรก

แต่ถ้าฉันเพิ่มวงเล็บปีกกาให้ใช้new Customer(id, "name"){}และทำ

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

ข้อมูลจะถูกแทรกจริง

ดูเหมือนว่า Curly Brackets จะสร้างความแตกต่าง แต่ฉันเดาว่าเมื่อเพิ่ม Curly Brackets แล้วเอนทิตีเฟรมเวิร์กจะรับรู้ว่านี่เป็นข้อมูลที่เป็นรูปธรรมจริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.