我有一些代码可以在代码中保存多对多关系。它在 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");
                     });
    }
}