Ваш код имеет некоторые проблемы.Прежде всего, если вы используете Self Tracking Entities, вам не нужно менять состояние службы отслеживания изменений в службе.Поскольку сущности с самопроверкой имеют свое собственное состояние, если вы попытаетесь сохранить какой-либо объект, контекст выполнит соответствующее действие в соответствии с состоянием отслеживания объекта.Таким образом, только присоединение обновленного объекта и вызов сохраненных изменений достаточно для сохранения объекта.
using ( var transaction = new TransactionScope() )
{
var connection = this.ConnectionManager.GetConnectionstring( AcademyOne.Models.Connection.A1Databases.A1VerwaltungEntity );
using ( var context = new istis.AcademyOne.Models.Models.A1Verwaltung.VerwaltungModelsContext( connection.Connectionstring ) )
{
foreach ( var seminar in seminare )
{
//The following line shall be commented out
//context.Seminar.Attach( seminar );
context.Seminar.ApplyChanges( seminar );
//The following line shall be commented out.
//context.ObjectStateManager.ChangeObjectState( seminar, StateValueConverter.GetEquivalentEntityState( seminar.ChangeTracker.State ) );
}
context.SaveChanges( SaveOptions.DetectChangesBeforeSave );
}
transaction.Complete();
}
Во-вторых, я думаю, что эта проблема возникает из-за того, что состояние сущности Dozent создано.Таким образом, когда вы вызываете метод присоединения для каждой обновленной сущности Семинара, к контексту объекта присоединяется новая сущность Dozent (фактически разные объекты с одинаковым идентификатором);что приводит к нарушению первичного ключа.
Чтобы решить эту проблему, вместо отправки списка семинаров отправьте объект, имеющий отношение один-ко-многим с объектами семинара (конечно, если у вас есть такой объект).
Или, если у вас нет родительской сущности, попробуйте установить значения внешнего ключа сущностей семинара, не устанавливая связанное свойство навигации Dozent.Сначала убедитесь, что свойства внешнего ключа существуют в файле модели EDMX.