Dưới đây là mô hình của tôi:Làm cách nào để xác định mối quan hệ Nhiều-với-Nhiều qua Khuôn khổ thực thể API thông thạo?
public class TMUrl
{
//many other properties
//only property with type Keyword
public List<Keyword> Keywords{get;set;}
}
public class Keyword
{
//many other properties
//only property with type TMUrl
public List<TMUrl> Urls{get;set;}
}
Vì vậy, rõ ràng, cả hai đối tượng có nhiều-nhiều mối quan hệ. tôi đã chọn api thông thạo nói với các thực thể khuôn khổ về mối quan hệ này tức là
modelBuilder.Entity<TMUrl>
.HasMany(s => s.Keywords)
.WithMany(s => s.URLs).Map(s =>
{
s.MapLeftKey("KeywordId");
s.MapRightKey("UrlId");
s.ToTable("KeywordUrlMapping");
});
nhưng khi tôi làm
url.Keywords.Add(dbKey); //where url is object of TMUrl,
//dbKey is an existing/new object of Keyword
db.SaveChanges();
tôi nhận được ngoại lệ
An error occurred while saving entities that do not expose foreign key
properties for their relationships....
InnerException:
The INSERT statement conflicted with the FOREIGN KEY constraint
"KeywordMaster_Keyword". The conflict occurred in database "DbName",
table "dbo.KeywordMaster", column 'Id'.The statement has been terminated.
nhưng khi tôi thêm Cấu hình từ những người khác, mọi thứ đều hoạt động tốt. ví dụ:
modelBuilder.Entity<KeyWord>
.HasMany(s => s.URLs)
.WithMany(s => s.Keywords)
.Map(s =>
{
s.MapLeftKey("KeywordId");
s.MapRightKey("UrlId");
s.ToTable("KeywordUrlMapping");
});
Tại sao ?. Tại sao tôi phải thêm cấu hình từ cả hai thực thể, nơi tôi đã đọc here và nhiều địa điểm khác, cấu hình cho một trong các thực thể nên làm.
Trường hợp là gì, khi tôi nên thêm cấu hình cho cả hai thực thể có liên quan đến mối quan hệ?
Tôi cần hiểu điều này. Tại sao. Hãy giúp tôi.
"* Xem InnerException để biết chi tiết *". Bạn đã? Đối với ngoại lệ hiếm khi hữu ích này, ngoại lệ bên trong thực sự quan trọng cần biết. – Slauma
@Slauma, tôi đã cập nhật câu hỏi với ngoại lệ bên trong, nhưng lưu ý rằng việc thêm mối quan hệ từ cả hai phía làm cho nó hoạt động. –
Câu hỏi thú vị sẽ là nếu * chỉ * ánh xạ thứ hai (không có ánh xạ đầu tiên) sẽ làm cho nó hoạt động. Nếu có, tôi nghi ngờ rằng cột 'KeywordId' trong bảng ánh xạ thực sự là khóa ngoài để bảng' URL' và không phải là 'Từ khoá'. (Chỉ nên có nếu đây là một DB hiện có với các mối quan hệ được tạo theo cách thủ công, không phải nếu bạn đã tạo DB bằng Mã-Đầu tiên.) – Slauma