我有一些代碼可以保存代碼中的多對多關係。它與Entity Framework 4.1一起工作良好,但在更新到Entity Framework 5之後,它失敗了。實體框架5升級後,多對多關係左右鍵翻轉
,我發現了以下錯誤:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_WebUserFavouriteEvent_Event". The conflict occurred in database "MainEvents", table "dbo.Event", column 'Id'.
我使用POCO實體與自定義映射。標準字段和多對一關係映射似乎工作正常。
UPDATE
好了,我已經有了SQL事件探查器安裝,情節變稠...
exec sp_executesql N'insert [dbo].[WebUserFavouriteEvent]([WebUserId], [EventId])
values (@0, @1)
',N'@0 int,@1 int',@0=1820,@1=14
這意味着:
WebUserId = @0 = 1820
EventId = @1 = 14
有趣的是是EF5似乎已經翻轉了外鍵 ... WebUserId應該是14和EventId應該是1820,而不是像現在這樣。
我審查了映射代碼,我99%我已經正確地設置了它。有關更多信息,請參閱Entity Framework Fluent API - Relationships MSDN article。
注意:我也發現這不僅限於保存,SELECT也被打破。
這裏的所有相關代碼:
服務層
public void AddFavEvent(WebUser webUser, Event @event)
{
webUser.FavouriteEvents.Add(@event);
_webUserRepo.Update(webUser);
}
庫
public void Update<T>(params T[] entities)
where T : DbTable
{
foreach (var entity in entities)
{
entity.UpdatedOn = DateTime.UtcNow;
}
_dbContext.SaveChanges();
}
注:我使用的每個請求的方法1周的DataContext,所以webUser
和@event
將從與_webUserRepo
中相同的上下文中加載。
實體(不用擔心DBTABLE東西)
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
}
映射
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");
});
}
}
我已經證實,回滾到EF 4.3.1修復了上述問題。因此,它肯定是在EF 5 – Charlino
重大更改不「LeftKey」指的是在連接表的左/第一列,並且不「RightKey」指的是在連接表右/第二列?從這個角度來看,你的映射是矛盾的:你映射一個和相同的關係,但是在第一個映射中,你的左列被稱爲「EventId」,而第二個左列被稱爲「WebUserId」。我會責怪EF不會在矛盾的映射中首先拋出異常,但顯然它只是其中之一,EF版本之間的差異是不同的。只要擺脫這兩種映射之一,你只需要一個。 – Slauma
@Slauma它如何矛盾?當我從**事件的角度映射,LeftKey應該是EVENTID ** ...然後當我從** WEBUSER的角度映射LeftKey應該是WebUserId **。我會考慮從Event和WebUser的角度對LeftKey(和RightKey)使用相同的值是一個矛盾......然後我期待一個例外。 – Charlino