Tôi có một số mã tiết kiệm nhiều mối quan hệ trong mã. Nó hoạt động tốt với Entity Framework 4.1 nhưng sau khi cập nhật lên Entity Framework 5, nó không thành công.Mối quan hệ nhiều và nhiều bên trái và phím phải lộn ngược sau khi nâng cấp Entity Framework 5
Tôi nhận được lỗi sau:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_WebUserFavouriteEvent_Event". The conflict occurred in database "MainEvents", table "dbo.Event", column 'Id'.
Tôi đang sử dụng các đối tượng POCO với ánh xạ tùy chỉnh. Trường tiêu chuẩn và ánh xạ mối quan hệ nhiều-một có vẻ hoạt động tốt.
CẬP NHẬT
Ok, vì vậy tôi đã có SQL Profiler cài đặt và cốt truyện đã dày ...
exec sp_executesql N'insert [dbo].[WebUserFavouriteEvent]([WebUserId], [EventId])
values (@0, @1)
',N'@0 int,@1 int',@0=1820,@1=14
Có nghĩa là:
WebUserId = @0 = 1820
EventId = @1 = 14
Điều thú vị là là EF5 dường như đã lật các phím nước ngoài xung quanh ... WebUserId phải là 14 và EventId phải là 1820, không phải cách khác xung quanh như bây giờ.
Tôi đã xem xét mã bản đồ và tôi 99% tôi đã thiết lập chính xác tất cả. Xem Entity Framework Fluent API - Relationships MSDN article để biết thêm thông tin.
LƯU Ý: Tôi cũng nhận thấy rằng điều này không bị hạn chế để lưu hoặc, các lệnh SELECT cũng bị hỏng.
Dưới đây là tất cả các mã liên quan:
Dịch vụ Lớp
public void AddFavEvent(WebUser webUser, Event @event)
{
webUser.FavouriteEvents.Add(@event);
_webUserRepo.Update(webUser);
}
Repository
public void Update<T>(params T[] entities)
where T : DbTable
{
foreach (var entity in entities)
{
entity.UpdatedOn = DateTime.UtcNow;
}
_dbContext.SaveChanges();
}
LƯU Ý: Tôi đang sử dụng 1 DataContext mỗi cách tiếp cận theo yêu cầu, số webUser
và @event
sẽ được tải từ cùng một ngữ cảnh giống như trong _webUserRepo
.
Entities (đừng lo lắng về DbTable thứ)
public class Event : DbTable
{
//BLAH
public virtual ICollection<WebUser> FavouriteOf { get; set; }
//BLAH
}
public class WebUser : DbTable
{
//BLAH
public virtual ICollection<Event> FavouriteEvents { get; set; }
//BLAH
}
Mappings
public class EventMapping : DbTableMapping<Event>
{
public EventMapping()
{
ToTable("Event");
//BLAH
HasMany(x => x.FavouriteOf)
.WithMany(x => x.FavouriteEvents)
.Map(x =>
{
x.MapLeftKey("EventId");
x.MapRightKey("WebUserId");
x.ToTable("WebUserFavouriteEvent");
});
}
}
public class WebUserMapping : DbTableMapping<WebUser>
{
public WebUserMapping()
{
HasMany(x => x.FavouriteEvents)
.WithMany(x => x.FavouriteOf)
.Map(m =>
{
m.MapLeftKey("WebUserId");
m.MapRightKey("EventId");
m.ToTable("WebUserFavouriteEvent");
});
}
}
Tôi đã xác nhận rằng việc quay lại EF 4.3.1 sẽ khắc phục được vấn đề trên. Vì vậy, nó chắc chắn là một thay đổi phá vỡ trong EF 5. – Charlino
Không "LeftKey" có nghĩa là cột bên trái/đầu tiên trong bảng nối, và không "RightKey" có nghĩa là cột phải/thứ hai trong bảng nối? Từ quan điểm đó, ánh xạ của bạn mâu thuẫn: Bạn ánh xạ một và cùng một mối quan hệ, nhưng trong ánh xạ đầu tiên cột bên trái của bạn được gọi là 'EventId' và cột thứ hai bên trái được gọi là' WebUserId'. Tôi sẽ đổ lỗi cho EF không ném một ngoại lệ ở nơi đầu tiên về bản đồ mâu thuẫn, nhưng dường như nó chỉ mất một trong số họ và cái này khác nhau giữa các phiên bản EF. Chỉ cần loại bỏ một trong hai ánh xạ, bạn chỉ cần một. – Slauma
@Slauma Làm thế nào nó mâu thuẫn? Khi tôi lập bản đồ từ phối cảnh của một sự kiện **, phím trái phải là EventId ** ... thì khi tôi ánh xạ từ phối cảnh của một ** WebUser thì LeftKey phải là WebUserId **. Tôi sẽ xem xét việc sử dụng cùng một giá trị cho LeftKey (và RightKey cho rằng vấn đề) từ cả hai sự kiện và phối cảnh WebUser một mâu thuẫn ... sau đó tôi mong đợi một ngoại lệ. – Charlino