Tôi đang sử dụng thiết lập EF5 dựa trên DBContext đầu tiên.AddOrUpdate hoạt động không như dự kiến và tạo ra các bản sao
Trong DbMigrationsConfiguration.Seed
Tôi đang cố gắng điền DB với dữ liệu giả định mặc định. Để thực hiện tác vụ này, tôi sử dụng phương thức DbSet.AddOrUpdate
.
Mã đơn giản nhất để minh họa cho mục tiêu của tôi:
j = 0;
var cities = new[]
{
"Berlin",
"Vienna",
"London",
"Bristol",
"Rome",
"Stockholm",
"Oslo",
"Helsinki",
"Amsterdam",
"Dublin"
};
var cityObjects = new City[cities.Length];
foreach (string c in cities)
{
int id = r.NextDouble() > 0.5 ? 0 : 1;
var city = new City
{
Id = j,
Name = c,
Slug = c.ToLowerInvariant(),
Region = regions[id],
RegionId = regions[id].Id,
Reviewed = true
};
context.CitySet.AddOrUpdate(cc => cc.Id, city);
cityObjects[j] = city;
j++;
}
Tôi đã cố gắng sử dụng/bỏ qua Id
lĩnh vực cũng như sử dụng Id
/Slug
tài sản như cập nhật selector.
khi Update-Database
được chạy, trường Id
bị bỏ qua và giá trị được tạo tự động bởi SQL Server và DB được lấp đầy với các bản sao; Bộ chọn Slug
cho phép trùng lặp và các lần chạy tiếp theo tạo ra ngoại lệ (Sequence contains more than one element
).
Phương thức AddOrUpdate
có hoạt động theo cách này không? Tôi có nên thực hiện upsert bằng tay?
Gert, cảm ơn bạn đã cố giúp đỡ! Trên thực tế, Thành phố đã được đưa ra 'id = j' trong khoảng từ 0 đến 9. Bạn chỉ bị lừa bởi các tên biến tương tự. Tiếp theo, tôi đã đề cập đến hiệu quả của việc sử dụng Name (trong trường hợp của tôi, Slug, vì nó thực sự độc đáo) - nó cho phép nhân đôi vào DB. Việc truyền tất cả các đối tượng dưới dạng mảng không mang lại tiến bộ nào. – berezovskyi
Cảm ơn bạn đã cập nhật câu trả lời của mình. Tôi không thể xác minh nó nữa. Nếu bất cứ ai từ cộng đồng sẽ bình luận theo câu trả lời của bạn rằng nó đã giúp anh ta/cô ấy, tôi sẽ đánh dấu câu trả lời của bạn là được chấp nhận. Xin lỗi vì mất quá nhiều thời gian. – berezovskyi
Bất kỳ ý tưởng nào biểu thức nhận diện sẽ trông như thế nào nếu nó yêu cầu hai trường để nhận dạng duy nhất bản ghi? Tôi đang nghĩ p => p.ProductName, p.CategoryName (nhưng tất nhiên là không hiệu quả). – Jarvis