Giả sử tôi có các lớp mô hình sau đây trong một thiết lập Entity Framework Code-First:cập nhật các đối tượng bị ngắt kết nối với nhiều-nhiều mối quan hệ
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
Cơ sở dữ liệu được tạo ra từ mã này bao gồm một bảng TeamPersons, đại diện cho nhiều -to-nhiều mối quan hệ giữa con người và các đội.
Giả sử tôi có đối tượng Person bị ngắt kết nối (không phải proxy và chưa đính kèm ngữ cảnh) có bộ sưu tập Nhóm chứa một hoặc nhiều đối tượng Nhóm bị ngắt kết nối, tất cả đều đại diện cho Nhóm đã có trong cơ sở dữ liệu. Một đối tượng như sẽ được tạo ra bởi những điều sau đây, chỉ là ví dụ, nếu một người nào có ID 1 và một đội với Id 3 đã tồn tại trong db:
var person = new Person
{
Id = 1,
Name = "Bob",
Teams = new HashSet<Team>
{
new Team { Id = 3, Name = "C Team"}
}
};
cách tốt nhất để cập nhật đối tượng này là gì, để sau khi cập nhật bảng TeamPersons chứa một hàng duy nhất cho Bob, liên kết anh ta với C Team? Tôi đã thử điều hiển nhiên:
using (var context = new TestContext())
{
context.Entry(person).State = EntityState.Modified;
context.SaveChanges();
}
nhưng bộ sưu tập Nhóm chỉ bị bỏ qua bởi điều này. Tôi cũng đã thử nhiều thứ khác, nhưng dường như không có gì làm chính xác những gì tôi đang ở đây. Cảm ơn vì bất kì sự giúp đỡ.
EDIT:
Vì vậy, tôi nhận được rằng tôi có thể lấy cả hai người và Nhóm [s] từ db, cập nhật chúng và sau đó cam kết thay đổi:
using (var context = new TestContext())
{
var dbPerson = context.People.Find(person.Id);
dbPerson.Name = person.Name;
dbPerson.Teams.Clear();
foreach (var id in person.Teams.Select(x => x.Id))
{
var team = context.Teams.Find(id);
dbPerson.Teams.Add(team);
}
context.SaveChanges();
}
Đây là một nỗi đau Tuy nhiên, nếu thực thể phức tạp của một người. Tôi biết tôi có thể sử dụng Automapper hoặc một cái gì đó để làm cho mọi việc dễ dàng hơn một chút, nhưng vẫn có vẻ xấu hổ nếu không có cách nào để cứu đối tượng ban đầu, thay vì phải lấy một cái mới và sao chép tất cả các thuộc tính qua ...
Mua bản thân, điều này dường như không làm việc: thêm một đội lấy từ db để một người mà không phải là một proxy vẫn không có cập nhật cho bảng TeamPersons. Công việc gì đang tìm nạp cả Nhóm và Người từ db (vì vậy Person là một proxy), nhưng sau đó bạn phải cập nhật Người đã tìm nạp này để phù hợp với Người đang được lưu ... – Duncan
Ah, bạn nói đúng (nên đã đọc tốt hơn). Sau khi chỉnh sửa: bạn có thể sử dụng 'DbContext.Entry (dbPerson) .CurrentValues.SetValues (person)'. –
Cảm ơn, đó là hữu ích - Tôi không biết về CurrentValues.SetValues – Duncan