【问题标题】:Getting duplicates when testing "one-to-many" relationship?测试“一对多”关系时出现重复项?
【发布时间】:2016-12-18 11:11:38
【问题描述】:

我在测试 Fluent NHibernate 的持久性时遇到了一些问题。我不确定这是否只是我对测试的理解不善或对测试的不正确期望。如果是这样,是否有人对如何最好地为 DAL 的这一部分设置单元测试有任何建议?

我有一对具有一对多关系的类 ClientFacility

一个:Client 可以有多个Facility

使用这个 FluentNHibernate 的映射结构,我希望它们应该是这样的:

public class ClientMapping : DataMapping<Client>
{
    public ClientMapping()
    {
        HasMany(client => client.Facilities)
            .Inverse()
            .Cascade
            .All();
    }
}

public class FacilityMapping : DataMapping<Facility>
{
    public FacilityMapping()
    {
        References(fac => fac.Owner);
    }
}

我遵循了 FNH 关于创建如下测试的建议,但在运行它时 - 我得到了一个带有 2 个客户端的 Client 表和一个带有两个不同 ID 的 Facility 表,即使我传入了一个对象。

    [Test]
    public void CanCorrectlyCreateFacilityTable()
    {
        _client = new Client {Name = "Preston"};

        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 1)
            .CheckProperty(f => f.Name, _facility1.Name)
            .CheckReference(f => f.Owner, _client)
            .VerifyTheMappings();

        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 2)
            .CheckProperty(f => f.Name, _facility2.Name)
            .CheckReference(f => f.Owner, _client)
            .VerifyTheMappings();

    }

我发现的最接近的 q/a 如下,但即使首先运行 Client 测试,我似乎也得到了相同的结果(可能是因为每次测试的数据库状态都会自行重置):

Cascade persist creates duplicate rows? Hibernate - one to Many relationship

【问题讨论】:

    标签: c# sql nhibernate fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

    事实证明我的预期是错误的。持久性规范测试只是测试数据到达数据库的位置 - 因此,它每次运行时都会发送新项目。

    为了测试映射是否正确地级联数据,我需要编写如下测试:

        [Test]
        public void CanSaveAndLoadFacilityMapping()
        {
            object id;
            object id2;
    
            using (var trans = _session.BeginTransaction())
            {
                id = _session.Save(_facility1);
                id2 = _session.Save(_facility2);
    
                trans.Commit();
            }
    
            _session.Clear();
    
            using (var trans = _session.BeginTransaction())
            {
                var facility = _session.Get<Facility>(id);
                var facility2 = _session.Get<Facility>(id2);
    
                Assert.AreEqual(facility.Name, _facility1.Name);
                Assert.AreEqual(facility.Owner.Name, _client.Name);
                Assert.AreEqual(facility2.Owner.Name, _client.Name);
                Assert.AreEqual(facility.Owner.Id, facility2.Owner.Id);
    
                trans.Dispose();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2017-08-27
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2021-09-28
      相关资源
      最近更新 更多