0

FluentとNhibernateは初めてなので、ここでは見られない単純な問題があるかもしれません。以下は私のマッピングです

public class DriverStatusChangeMapping : ClassMap<DriverStatusChange>
{
    public DriverStatusChangeMapping()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.CreateReceivedAt);
        Map(x => x.RemoveReceivedAt);
        Map(x => x.Status);
        Component<AuditAction>(x => x.Created, m =>
        {
            m.Map(x => x.ActionByUser).Column("CreatedByUser");
            m.Map(x => x.ActionByUserType).Column("CreatedByUserType");
            m.Map(x => x.ActionOccurredAt).Column("CreatedAt");
        });
        Component<AuditAction>(x => x.Removed, m =>
        {
            m.Map(x => x.ActionByUser).Column("RemovedByUser");
            m.Map(x => x.ActionByUserType).Column("RemovedByUserType");
            m.Map(x => x.ActionOccurredAt).Column("RemovedAt");
        });

        References(c => c.DriverLogEntry)
            .Column("DriverLogEntryID")
            .Access.Property()
            .Cascade.All();

        Table("tblDriverStatusChange");

    }
}

リポジトリが適切なデータを返すことを確認するためにメモリ内テストを使用しています。私のRespositoryTestBaseは次のとおりです。

public class RepositoryTestBase : IDisposable
{
    private static NHConfiguration.Configuration _configuration;
    private static ISessionFactory _sessionFactory;

    protected ISession Session { get; set; }

    public RepositoryTestBase()
    {
        _sessionFactory = CreateSessionFactory();
        Session = _sessionFactory.OpenSession();
        BuildSchema(Session);
    }

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
          .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
          .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Driver>())
          .ExposeConfiguration(cfg => _configuration = cfg)
          .BuildSessionFactory();

    }

    public void BuildSchema(ISession session)
    {
        var export = new SchemaExport(_configuration);
        export.Execute(true, true, false, Session.Connection, null);
    }



    public void Dispose()
    {
        Session.Dispose();
    }
}

今、私がそのようにセッションでgetを実行するとき....私はDriverStatusChangeレコードを持っています

_session.Get<DriverStatusChange>(new Guid("6c9b5d4d-986d-4ff7-86ae-a05300d34a8b")); 

ただし、次のような単純なクエリは常に空のリストを返します。

_session.Query<DriverStatusChange>().Select(d => d).ToList();

以下は、RepositoryTestBaseを使用する私のテストクラスです。

public class DriverStatusChangeRepositoryTests:RepositoryTestBase
{
    private IDriverStatusChangeRepository _driverStatusChangeRepository;


    [SetUp]
    public void Init()
    {

        var mockLogger = new Mock<ILogger>();
        _driverStatusChangeRepository = new DriverStatusChangeRepository(Session, mockLogger.Object);


    }


    [TearDown]
    public void TearDown()
    {
        Session.Clear();
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        Dispose();
    }


    [Test]
    public void get_where_removed_at_is_null()
    {
      var driverStatusChanges = CreateDriverStatusChanges(4);
               var removedDriverStatusChange = driverStatusChanges[1];
                removedDriverStatusChange.Removed = new AuditAction()
                                                {
                                                    ActionByUser = "John Doe",
                                                    ActionByUserType = "User Type",
                                                    ActionOccurredAt = DateTime.UtcNow
                                                };
                removedDriverStatusChange.RemoveReceivedAt = DateTime.UtcNow;
                _driverStatusChangeRepository.Update(removedDriverStatusChange);

                var actual = _driverStatusChangeRepository.GetCurrent(10001, DateTime.MinValue, DateTime.UtcNow).Count;
                Assert.AreEqual(3,actual, "Get current did not match");




    }


    private List<DriverStatusChange> CreateDriverStatusChanges(int number)
    {

        var driverStatusChanges = new List<DriverStatusChange>();
        for (int i = 0; i < number; i++)
        {
            var driverStatusChange = new DriverStatusChange()
            {
                Created = GetCreated(i),
                CreateReceivedAt = DateTime.UtcNow,
                DriverLogEntry = new DriverLogEntry() {CreateReceivedAt = DateTime.UtcNow, Id = Guid.NewGuid(), Driver = new Driver() { DriverID = i+10000}},
                Removed = null,
                RemoveReceivedAt = null
            };
            _driverStatusChangeRepository.Add(driverStatusChange);
            driverStatusChanges.Add(driverStatusChange);

        }
        return driverStatusChanges;
    }

    private AuditAction GetCreated(int number)
    {
        return
            new AuditAction()
                {
                    ActionByUser = "Jane Doe" + number.ToString(CultureInfo.InvariantCulture),
                    ActionByUserType = "User Type",
                    ActionOccurredAt = DateTime.UtcNow
                };

    }




}
4

2 に答える 2

1

試す

_session.Query<DriverStatusChange>().ToList();

_session.QueryはIQueryableを返します。これは、直接「ToList()」を呼び出すことができます。

編集:(上記の私の愚かさを無視してください)。

レコードを取得する前にセッションが閉じられ、再開されているためですか?セッションが終了すると、SQLiteInMemoryがドロップするだけだと確信しています。次の読み取り時に再作成され、この時点で空になります。

解決策は、接続が閉じられるのを防ぐデータベース接続プロバイダーを使用することです。これにより、InMemoryデータベースのドロップも防止されます。

public class DatabaseConnectionProviderThatCachesTheConnection : DriverConnectionProvider
{
    static IDbConnection _databaseConnection;

    public override void CloseConnection(IDbConnection conn)
    {
        // Deliberately override to do nothing.
    }

    public override IDbConnection GetConnection()
    {
        if (_databaseConnection == null)
        {
            _databaseConnection = base.GetConnection();
        }

        return _databaseConnection;
    }
}

次に、これをセッションファクトリで使用できます。

 private static ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
      .Database(SQLiteConfiguration
          .Standard
          .InMemory()
          .Raw(Environment.ConnectionProvider, 
               typeof(DatabaseConnectionProviderThatCachesTheConnection)
               .AssemblyQualifiedName)
          .ShowSql())
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Driver>())
      .ExposeConfiguration(cfg => _configuration = cfg)
      .BuildSessionFactory();
}
于 2012-05-16T18:17:26.387 に答える
1

トランザクションやSession.Flushが表示されないので、変更がコミットされていないため、結果が返されないのはそのためだと思います。でCreateDriverStatusChanges、後

_driverStatusChangeRepository.Add(driverStatusChange);

追加

Session.Flush()

于 2012-05-17T19:07:26.987 に答える