У меня есть код, который сохраняет многие и многие отношения в коде. Он отлично работает с Entity Framework 4.1, но после обновления до Entity Framework 5 он не работает.
Я получаю следующую ошибку:
Оператор INSERT противоречил ограничению FOREIGN KEY "FK_WebUserFavouriteEvent_Event". Конфликт произошел в базе данных "MainEvents", в таблице "dbo.Event", в столбце "Id".
Я использую объекты POCO с пользовательскими сопоставлениями. Стандартное поле и сопоставления отношения "один к одному", похоже, работают нормально.
UPDATE
Хорошо, поэтому у меня установлен 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);
}
Repository
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");
});
}
}