/ / Jeden błąd jednorazowy przerywa kolejne użycie struktury Entity - ef-code-first, autofac, lifecycle, entity-framework-5

Jednorazowy błąd przerywa kolejne użycie struktury Entity - ef-code-first, autofac, lifecycle, entity-framework-5

Mamy problem z strukturą encji. Na przykład, jeśli wykonamy:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

a następnie próbujemy usunąć obiekt, który ma odwzorowane elementy podrzędne, które od niego zależą, jest logiczne, że otrzymujemy błąd. (Nie można usunąć elementu nadrzędnego, gdy istnieją dzieci w bazie danych, które są od niego zależne).

Następnie, używając nowej instancji kontekstu, robiąc "ParentEntity.ChildEntities.ToList ()" nadal występuje problem!

Obejściem jest ponowne uruchomienie puli aplikacji, a problem znika.

Używamy Autofac i cykl życia kontekstu jest ustawiony (i potwierdzony) na HttpRequest, więc błąd utrzymuje się gdzie indziej. Masz pomysł, co można zrobić, aby uniknąć tych błędów?

Domyślamy się, że treść kontekstu jest trwałagdzie indziej i przechowuje stan obiektów podrzędnych jako "EntityState.Deleted", co koliduje z rzeczywistymi danymi otrzymywanymi z bazy danych podczas kolejnych wywołań.

Aktualizacja: Wygląda na to, że dokładniejsze zbadanie stosu ujawnia, że ​​istnieje leniwy kontekst wewnętrzny:

[DbUpdateException: An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.]
System.Data.Entity.Internal.InternalContext.SaveChanges() +200
System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +33
System.Data.Entity.DbContext.SaveChanges() +20

Może gdybym miał jakoś wyłączyć LazyInternalContext? Czy można to zrobić?

Odpowiedzi:

0 dla odpowiedzi № 1

Jeśli nie chcesz uzyskać wyjątków i zachować bazę danych w prawidłowym stanie, z jakiegoś powodu możesz to zrobić, zatrzymując sprawdzanie oryginalności:

context.Configuration.ValidateOnSaveEnabled = false; // you can put this in the constructor of your context;
context.SaveChanges();