hiện tôi mới để EF 4 và đây là những gì tôi đã làm cho đến nay:đối tượng Insert mới với đối tượng
- Tạo một tập tin edmx dựa trên cơ sở dữ liệu của tôi
- Tạo một thế hệ mã cho đối tượng của tôi (POCO). Bây giờ tôi có một model1.tt, khi mở rộng tôi thấy al lớp học của tôi
- Tạo một kho lưu trữ cho mỗi lớp, dựa trên IRepository
Bây giờ, tôi đang làm việc với hai đối tượng, A và B. Object A có một thuộc tính kiểu B. Trong winform của tôi, tôi có một combo chứa đầy các đối tượng kiểu B. Khi nhấn nút save, một cá thể mới của lớp A được tạo và tất cả các thuộc tính được thiết lập. Thuộc tính đối tượng B được đặt như sau:
objectA.myObjectB = (objectB)cmbBObjects.selectedItem;
Sau đó, tôi tạo kho lưu trữ cho đối tượngA và gọi phương thức lưu. Trong phương pháp lưu này, tôi có mã này ±
public bool Save(ObjectA obj)
{
using(MyContext context = new MyContext())
{
context.objectAs.AddObject(obj);
context.SaveChanges();
}
}
Mã này, lưu một mục mới vào cơ sở dữ liệu, nhưng nó cũng tạo bản ghi mới cho đối tượng B! Tôi không muốn điều này, bởi vì đối tượng B đã tồn tại trong cơ sở dữ liệu! (Tôi đã chọn cái này từ combobox).
Đây là cách tôi điền vào combobox của tôi:
Trong kho objectB:
public IList<ObjectB> GetAll()
{
using(MyContext context = new MyContext())
{
IList<ObjectB> objects = context.objectBs.ToList();
return objects;
}
}
Ở dạng của tôi:
ObjectBRepository rep = new ObjectBRepository();
IList<ObjectB> objects = rep.GetAll;
cmbBObjects.Datasource = objects;
// etc..
Vì vậy, câu hỏi của tôi là, những gì tôi phải làm thế nào để lưu đối tượng A mà không tạo bản ghi mới cho đối tượngB?
Cảm ơn bạn. Tôi không hiểu gợi ý 1. Đề xuất thứ hai: Trong kho lưu trữ của objectA, làm một cái gì đó như: 'var obj = context.ObjectB.where (b => b.Id == objectA.myObjectB.Id) .firstOrDefault() ; context.ObjectA.Attach (obj); 'Điều này có đúng không? – Martijn
Tôi đã chỉnh sửa câu trả lời của mình. –
@LadislavMrnka: Chính xác, tất cả các tùy chọn có thể có và tôi cho rằng tùy chọn thứ hai là tốt nhất cho ví dụ trên. +1 –