Tôi lấy dữ liệu phim từ một API bên ngoài. Trong giai đoạn đầu tiên, tôi sẽ cạo từng bộ phim và chèn nó vào cơ sở dữ liệu của riêng tôi. Trong giai đoạn thứ hai, tôi sẽ định kỳ cập nhật cơ sở dữ liệu của mình bằng cách sử dụng API "Thay đổi" của API mà tôi có thể truy vấn để xem phim nào đã thay đổi thông tin của họ.
Lớp ORM của tôi là Entity-Framework. Lớp Phim trông như thế này:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Vấn đề phát sinh khi tôi có một bộ phim cần được cập nhật: cơ sở dữ liệu của tôi sẽ nghĩ về đối tượng được theo dõi và đối tượng mới mà tôi nhận được từ lệnh gọi API cập nhật là các đối tượng khác nhau, không để ý .Equals()
.
Điều này gây ra sự cố bởi vì bây giờ tôi cố gắng cập nhật cơ sở dữ liệu với phim được cập nhật, nó sẽ chèn nó thay vì cập nhật Phim hiện có.
Tôi đã gặp vấn đề này trước đây với các ngôn ngữ và giải pháp của tôi là tìm kiếm các đối tượng ngôn ngữ đính kèm, tách chúng khỏi ngữ cảnh, di chuyển PK của chúng sang đối tượng được cập nhật và gắn nó vào ngữ cảnh. Khi SaveChanges()
được thực thi, về cơ bản nó sẽ thay thế nó.
Đây là một cách tiếp cận khá có mùi vì nếu tôi tiếp tục cách tiếp cận này với Movie
đối tượng của mình , điều đó có nghĩa là tôi sẽ phải tách phim, ngôn ngữ, thể loại và từ khóa, tra cứu từng người trong cơ sở dữ liệu, chuyển ID của họ và chèn đối tượng mới.
Có cách nào để làm điều này thanh lịch hơn? Lý tưởng nhất là tôi chỉ muốn chuyển bộ phim được cập nhật vào bối cảnh và chọn bộ phim chính xác để cập nhật dựa trên Equals()
phương thức, cập nhật tất cả các trường của nó và cho từng đối tượng phức tạp: sử dụng lại bản ghi hiện có dựa trên Equals()
phương thức riêng của nó và chèn nếu nó chưa tồn tại
Tôi có thể bỏ qua việc tách / đính kèm bằng cách cung cấp .Update()
các phương thức trên từng đối tượng phức tạp mà tôi có thể sử dụng kết hợp với việc truy xuất tất cả các đối tượng được đính kèm nhưng điều này vẫn sẽ yêu cầu tôi truy xuất mọi đối tượng hiện có để cập nhật nó.
id
và các phim từ API bên ngoài được khớp với các phim cục bộ sử dụng trường này tmdbid
. Tôi không thể truy xuất tất cả các thực thể cần được cập nhật trong một cuộc gọi vì đó là về phim, thể loại, ngôn ngữ, từ khóa, v.v ... Mỗi thực thể này đều có PK và có thể đã tồn tại trong cơ sở dữ liệu.