#c# #asp.net-mvc #entity-framework #ef-code-first #repository-pattern
#c# #asp.net-mvc #entity-framework #ef-code-first #репозиторий-шаблон
Вопрос:
Я запускаю (старое) веб-приложение MVC3 в базе данных MSSQL, сначала используя код EF 6.0 и шаблон репозитория.
система работает в рабочей среде последние 7 лет (EF был обновлен около 1 года назад).
Я столкнулся с очень странным исключением в одной конкретной области системы. при попытке создать или обновить определенные объекты я сталкиваюсь со следующим исключением:
Сбой операции: связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не обнуляются. Когда в связь вносится изменение, связанному свойству внешнего ключа присваивается нулевое значение. Если внешний ключ не поддерживает значения null, должна быть определена новая связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от null, или несвязанный объект должен быть удален.
вот одна из проблемных сущностей:
public class BeaconAppErrorLog
{
[Key]
public int Id { get; set; }
public int EntityId { get; set; }
public string RawJson { get; set; }
public DateTime SavedAt { get; set; }
public int? EmployeeId { get; set; }
[ForeignKey("EmployeeId")]
public Employee Employee { get; set; }
public int? ContainerId { get; set; }
[ForeignKey("ContainerId")]
public Container Container { get; set; }
public int? DailyTrackId { get; set; }
[ForeignKey("DailyTrackId")]
public DailyTrack DailyTrack { get; set; }
public int? ClientId { get; set; }
[ForeignKey("ClientId")]
public Client Client { get; set; }
public string Error { get; set; }
}
вот код для создания и сохранения :
DataContext.BeaconAppErrorLogs.Add(new BeaconAppErrorLog()
{
EntityId = 2,
SavedAt = DateTime.Now,
EmployeeId = activity.EmployeeId,
DailyTrackId = activity.DailytrackId,
Error = error
});
DataContext.SaveChanges();
поля ‘EmployeeID’ и ‘DailyTrackId’ являются внешними ключами, они получают
допустимые значения (т. Е. идентификаторы, которые соответствуют соответствующему объекту и существуют в БД)
почти идентичный код пишется сотни раз по всему приложению — и функционирует должным образом (даже для одного и того же объекта).
Я понятия не имею, что происходит и почему, и до сих пор все решения, которые я пробовал, не работали.
Мы будем очень признательны за вашу помощь!
Спасибо,
Nir
Комментарии:
1. Можете ли вы показать код сопоставления или, лучше всего, структуру в базе данных?
2. @Nikolaus что вы подразумеваете под «отображением кода» или структуры в БД»? класс является сущностью, созданной в БД с помощью EF code-first
3. вы уверены, что EF не отслеживает какие-либо другие объекты во время
SaveChanges
вызова, которые могли бы вызвать эту ошибку? вы можете вызвать db.savechanges перед добавлением объекта и посмотреть, выдается ли такое же исключение, чтобы проверить это. я также взгляну на базу данных и удостоверюсь, что эти FK определены как обнуляемые просто для проверки работоспособности4. я переформулирую комментарий Грега: вы уверены, что
SaveChanges
только вставить новую строку в таблицу журнала?5. Я имею в виду миграции, например, и Грег спросил, возможно ли, что отслеживается какой-либо другой объект, который вызывает ошибку?
Ответ №1:
оказывается, решение было где-то совсем в другом месте. как указали @gregH и @tschmit007, EF отслеживает изменения в объектах. как только мы начали перемещать команду ‘DataContext.SaveChanges()’ выше по цепочке выполнения, мы обнаружили, что изменения, внесенные в одну из вышестоящих сущностей, были причиной проблемы. фактической проблемой была модификация свойства дочерней коллекции для объекта DailyTrack. модификация состояла в фильтрации данных коллекции (LINQ, ГДЕ Клаус выполнял работу с коллекцией).
спасибо всем за вашу помощь.