2012-05-29 3 views
1

Я пытался сопоставить два объекта, используя взаимно однозначное отношение «один к одному». Связь между этими двумя объектами не требуется. Вот объекты:Fluent NHibernate с нулевым однозначным отображением

public class Tenant 
{ 
    public virtual int TenantId { get; set; } 

    public virtual string Name { get; set; } 

    public virtual Unit Unit { get; set; } 
} 

public class Unit 
{ 
    public virtual int UnitId { get; set; } 

    public virtual string UnitNumber { get; set; } 

    public virtual int Rooms { get; set; } 

    public virtual Tenant Tenant { get; set; } 
} 

И здесь отображения Я пытаюсь использовать:

public class Mappings : ClassMap<Unit> 
{ 

    /* 
    * Unit 
    * ------------ 
    * UnitId (PK) 
    * TenantId (FK) 
    * Rooms 
    * UnitNumber 
    */ 

    public Mappings() 
    { 
     Id(x => x.UnitId).GeneratedBy.Identity(); 

     References(x => x.Tenant); 

     Map(x => x.Rooms).Not.Nullable(); 
     Map(x => x.UnitNumber).Not.Nullable(); 
    } 
} 



public class TenantMapping : ClassMap<Tenant> 
{ 
    /* 
    * Tenant 
    * ------------- 
    * TenantId (PK) 
    * Name 
    */ 
    public TenantMapping() 
    { 
     Id(x => x.TenantId).GeneratedBy.Identity(); 

     Map(x => x.Name).Not.Nullable(); 

     HasOne(x => x.Unit).PropertyRef(x => x.Tenant); 
    } 
} 

ожидаемые определения таблиц в комментариях отображения. Тесты, которые я использую для проверки отображения не удается:

[Test] 
    public void SetTenantOnUnit() 
    { 
     int unitId = 0; 
     int tenantId = 0; 
     using (var session = factory.OpenSession()) 
     { 
      var tenants = Builder<Tenant>.CreateListOfSize(5).Build(); 
      var unit = Builder<Unit>.CreateNew().Build(); 
      foreach(var tenant in tenants) 
       session.Save(tenant); 

      session.Save(unit); 

      unit.Tenant = tenants[3]; 
      tenantId = unit.Tenant.TenantId; 
      session.SaveOrUpdate(unit); 

      unitId = unit.UnitId; 
     } 

     using (var session = factory.OpenSession()) 
     { 
      var unit = session.Get<Unit>(unitId); 
      Assert.That(unit, Is.Not.Null); 
      Assert.That(unit.Tenant, Is.Not.Null); 
      Assert.That(unit.Tenant.TenantId, Is.EqualTo(tenantId), "Incorrect Tenant Id"); 
     } 

    } 

    [Test] 
    public void SetUnitOnTenant() 
    { 
     int tenantId = 0; 
     int unitId = 0; 
     using (var session = factory.OpenSession()) 
     { 
      var tenant = Builder<Tenant>.CreateNew().Build(); 
      var units = Builder<Unit>.CreateListOfSize(5).Build(); 
      session.Save(tenant); 

      foreach(var unit in units) 
       session.Save(unit); 


      tenant.Unit = units[3]; 
      unitId = tenant.Unit.UnitId; 

      session.SaveOrUpdate(tenant); 
      tenantId = tenant.TenantId; 
     } 

     using (var session = factory.OpenSession()) 
     { 
      var tenant = session.Get<Tenant>(tenantId); 
      Assert.That(tenant, Is.Not.Null); 
      Assert.That(tenant.Unit, Is.Not.Null); 
      Assert.That(tenant.Unit.UnitId, Is.EqualTo(unitId), "Incorrect unit id"); 
     } 
    } 

Я включил исходный код здесь: https://bitbucket.org/crmckenzie/fluentnhibernate.discovery/overview

В идеале, я бы смог создать отношения с обеих сторон и сохранить его успешно в базе данных. Я прочитал другие индивидуальные темы отображения на StackOverFlow, и ни один из них, кажется, не находится прямо в точке. Как правильно сопоставить эти отношения?

ответ

0

ваш недостаток session.Flush(); после unitId = unit.UnitId; и tenantId = tenant.TenantId; поэтому назначение не сохраняется в дБ. Причина, по которой сохраняются арендаторы и единицы, заключается в том, что вы принудительно вставляете NHibernate на session.Save(). Поскольку вы установили GeneratedBy.Identity(), nhibernate должен запросить базу данных для идентификатора, иначе unitId = unit.UnitId; даст неверный результат.