Expulsión de esfuerzo InvalidOperationException: la secuencia contiene más de un elemento coincidente

c# effort entity-framework

Pregunta

Estoy usando Effort de una manera regular al crear una conexión y pasarla a DB Context:

public class InMemoryContextInitializer
{
    public void BeforeAllTests()
    {
        Effort.Provider.EffortProviderConfiguration.RegisterProvider();
    }

    public DbConnection BeforeEachTest()
    {
        return Effort.DbConnectionFactory.CreateTransient();
    }

    public void AfterEachTest(DbConnection prevUsedConnection)
    {
        prevUsedConnection.Dispose();
    }
}

y algo como esto:

    private static InMemoryContextInitializer _testHarness;
    private DbConnection _conn;
    private MyDbContext _myContext;

    [ClassInitialize]
    public static void BeforeAllTests(TestContext testCtx)
    {
        _testHarness = new InMemoryContextInitializer();
        _testHarness.BeforeAllTests(); // registers provider
    }

    [TestInitialize]
    public void BeforeTest()
    {
        _conn = _testHarness.BeforeEachTest();
        _myContext = new MyDbContext(_conn);
    }

    [TestCleanup]
    public void AfterTest()
    {
        _testHarness.AfterEachTest(_conn);
    }

Todas mis pruebas de Esfuerzo pasan muy bien, excepto una que arroja esto:

System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> 
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> 
System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> 
NMemory.Exceptions.NMemoryException: Error code: GenericError ---> 
System.InvalidOperationException: Sequence contains more than one matching element

    at System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source, Func`2 predicate)
   at NMemory.Tables.TableCollection.FindTable(Type entityType)
   at NMemory.Utilities.TableCollectionExtensions.FindTable(TableCollection tableCollection)
   at NMemory.Execution.CommandExecutor.ExecuteInsert(T entity, IExecutionContext context)
   at NMemory.Tables.DefaultTable`2.InsertCore(TEntity entity, Transaction transaction)
   at Effort.Internal.DbManagement.Engine.ExtendedTable`2.InsertCore(TEntity entity, Transaction transaction)
   at NMemory.Tables.Table`2.Insert(TEntity entity, Transaction transaction)
 --- End of inner exception stack trace ---
    at NMemory.Tables.Table`2.Insert(TEntity entity, Transaction transaction)
   at Effort.Internal.Common.DatabaseReflectionHelper.WrapperMethods.InsertEntity(ITable`1 table, TEntity entity, Transaction transaction)
 --- End of inner exception stack trace ---
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Effort.Internal.Common.DatabaseReflectionHelper.InsertEntity(ITable table, Object entity, Transaction transaction)
   at Effort.Internal.CommandActions.InsertCommandAction.CreateAndInsertEntity(ITable table, IList`1 memberBindings, Transaction transaction)
   at Effort.Internal.CommandActions.InsertCommandAction.ExecuteNonQuery(ActionContext context)
   at Effort.Provider.EffortEntityCommand.ExecuteNonQuery()
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
   at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
 --- End of inner exception stack trace ---
    at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update(T noChangesResult, Func`2 updateFunction)
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()
   at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()
   at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
 --- End of inner exception stack trace ---
    at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at System.Data.Entity.Migrations.History.HistoryRepository.BootstrapUsingEFProviderDdl(VersionedModel versionedModel)
   at System.Data.Entity.Internal.InternalContext.<SaveMetadataToDatabase>b__7()
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.SaveMetadataToDatabase()
   at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
   at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState)
   at System.Data.Entity.Database.Create(DatabaseExistenceState existenceState)
   at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e()
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
 --- End of inner exception stack trace ---
    at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
   at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
   at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.Count(IQueryable`1 source)

   at Model.MyProj... my test method call stack here

Utilizo múltiples contextos de base de datos en estas pruebas y todo funciona, excepto en este caso:

var query = db.MyEntities.Count(); // will throw the exception above ONLY FOR SOME DB CONTEXTS

De hecho, cualquier operación en este contexto como Add lanzará.

No pude encontrar a nadie que tenga el mismo problema en el sitio web de Effort o en Google. Tal vez es un error? Estoy usando la última versión de Effort - 1.1.4 y Entity Framework - 6.1.3.

Revisé cualquier cosa especial sobre DbContext o la clase de entidad y no encontré nada.

Respuesta popular

Tuve este problema y encontré que usar una conexión separada ( Effort.DbConnectionFactory.CreatePersistent ) para cada contexto resolvió el problema.

En mi caso, cada contexto opera sobre tablas completamente diferentes, por lo que no debería haber habido un conflicto en Effort / NMemory, por lo que creo que el informe de errores es correcto, pero esta información puede desbloquear a las personas mientras tanto.

La desventaja es que esto podría estar advirtiéndole de que realmente tiene dos contextos operando en la misma tabla, lo que sería malo, por lo que también deberá vigilar esto.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué