Cách gieo dữ liệu bằng AddOrUpdate với một khóa phức tạp trong EF 4.3


101

Tôi đang cố gắng tạo cơ sở dữ liệu phát triển với một số dữ liệu thử nghiệm.

Tôi đã sử dụng context.People.AddOrUpdate(p => p.Id, people));với nhiều thành công.

Tôi có một bảng khác mà tôi cần bắt đầu, trong đó tôi sẽ không biết khóa chính.

Ví dụ: tôi muốn AddOrUpdate dựa trên sự trùng khớp Họ và Tên.

Tôi không chắc làm thế nào để viết Biểu thức một cách chính xác.

context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);

rõ ràng là không chính xác, nhưng tôi hy vọng nó truyền đạt giải pháp mà tôi đang tìm kiếm.

Câu trả lời:


200

Thử cái này:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);

12
@LadislavMrnka điều gì xảy ra nếu định danh cần phải là một loại phức tạp context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe

3
@LadislavMrnka, nếu thuộc tính là kiểu nullable thì sao? tức là context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247,

2
Một điều cần lưu ý ở đây là tập hợp 'mọi người' cần phải là một ĐẾN ĐẾN chứ không phải danh sách. Nếu bạn có một danh sách các thực thể, bạn có thể chỉ cần gọi .ToArray () trên danh sách. Tôi vật lộn với một :) - câu trả lời Tốt
Dean Martin

1
không thể làm việc này. Có thể vì (ngoài 3 thuộc tính được chỉ định trong khóa tổng hợp) tôi có một trường ID khác với các số được tạo tự động?
Sonic Soul

@LadislavMrnka cần giữ lại thư mục Migration (Configuration.cs và ...) sau khi di chuyển và cập nhật các trường cơ sở dữ liệu ???
AminM

1

Nếu bạn nhận được Only primitive types or enumeration types are supported in this context.do sử dụng thuộc tính điều hướng - hãy xem xét thêm thuộc tính khóa ngoại trực tiếp vào thực thể (có thể chỉ với getter) và sử dụng nó như Ladislav Mrnka đã đề xuất.


Làm cách nào để thêm thuộc tính điều hướng của khóa ngoại bảng khác trong code firstcách tiếp cận? Tôi có cấu trúc như thế context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)nào? Nó điều này có thể
Yogen darji

Nếu tôi lỗi bộ tài sản getter làThe specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Yogen darji
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.