Hi,
I have the following exception with DataObjects 5.
Call stack :
Result Message:
Test method UnitTests.Orm.DataObjects.TestTransactionRollback threw exception:
System.InvalidOperationException: Can not persist: there are pinned entities.
Result StackTrace:
at Xtensive.Orm.Session.Persist(PersistReason reason)
at Xtensive.Orm.Session.CommitTransaction(Transaction transaction)
at Xtensive.Orm.Transaction.Commit()
at Xtensive.Orm.TransactionScope.Dispose()
at UnitTests.Orm.DataObjects.TestTransactionRollback() in c:\Work-Dev\aradus\Projets\DonatelloBranches\DataObjects5\UnitTests\Orm\DataObjects.cs:line 85
Here the code to reproduce it :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Xtensive.Orm;
using Xtensive.Orm.Configuration;
namespace UnitTests.Orm
{
[TestClass]
public class DataObjects
{
[TestMethod, TestCategory("Transaction.Rollback")]
public void TestTransactionRollback()
{
Domain domain = CreateDomain(SessionOptions.ValidateEntities | SessionOptions.AutoActivation | SessionOptions.NonTransactionalReads);
using (Session session = domain.OpenSession())
{
Assert.IsTrue(!Query.All<TestEntity>().Any(), "TestEntity table should be empty");
using (TransactionScope t = session.OpenTransaction())
{
new TestEntity(session);
// transaction not committed : will be rolled back
}
Assert.IsTrue(!Query.All<TestEntity>().Any());
using (TransactionScope t = session.OpenTransaction())
{
new TestEntity(session) { MyValue = 1000 };
t.Complete();
}
Assert.IsTrue(Query.All<TestEntity>().Count() == 1);
Assert.IsTrue(Query.All<TestEntity>().Single().MyValue == 1000);
using (TransactionScope t = session.OpenTransaction())
{
Query.All<TestEntity>().Single().MyValue = 2000;
// transaction not committed : will be rolled back
}
Assert.IsTrue(Query.All<TestEntity>().Single().MyValue == 1000);
}
}
private Domain CreateDomain(SessionOptions sessionOptions)
{
string connectionString = Configuration.Instance.DataObjectsConnectionString;
var config = new DomainConfiguration(connectionString);
config.UpgradeMode = DomainUpgradeMode.Recreate;
config.Types.Register(typeof(TestEntity));
SessionConfiguration defaultSessionConfig = config.Sessions.Default;
if (defaultSessionConfig == null)
{
defaultSessionConfig = new SessionConfiguration(WellKnown.Sessions.Default);
config.Sessions.Add(defaultSessionConfig);
}
defaultSessionConfig.Options = sessionOptions;
return Domain.Build(config);
}
}
}
[HierarchyRoot]
public class TestEntity : Entity
{
[Field, Key]
public int Id { get; private set; }
[Field]
public long MyValue { get; set; }
public TestEntity(Session session)
: base(session)
{
}
}
Could you have a look ?
Thanks,
Benoit
asked
Aug 29 '16 at 11:08
Benoit Nesme
43●20●20●24
The exception will happen when disposing the second transaction, after the call of t.Complete().