我有一些代码可以在代码中保存多对多关系。它在 Entity Framework 4.1 上运行良好,但在更新到 Entity Framework 5 后,它失败了。
我收到以下错误:
INSERT 语句与 FOREIGN KEY 约束“FK_WebUserFavouriteEvent_Event”冲突。冲突发生在数据库“MainEvents”、表“dbo.Event”、列“Id”中。
我正在使用带有自定义映射的 POCO 实体。标准字段和多对一关系映射似乎工作正常。
更新
好的,所以我已经安装了 SQL Profiler 并且情节变厚了......
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 - 关系 MSDN 文章。
注意:我还发现这不仅限于保存,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");
});
}
}