2010-07-05 72 views
0

我在一些项目中使用了Fluent NH,但我在使用PersistenceSpecification类测试集合映射时遇到了一些问题。下面是我的类的代码(我只是把这里的集合定义):流利的NHibernate:测试与CheckList的集合映射

public class Ocorrencia : EntityWithAction, IHasAssignedId<Int32> {  
    private IList<Intervencao> _intervencoes = new List<Intervencao>(); 
    public IEnumerable<Intervencao> Intervencoes { 
    get{ 
    return new ReadOnlyCollection<Intervencao>(_intervencoes); 
    } 
set { 
    _intervencoes = new List<Intervencao>(value); 
    Contract.Assume(_intervencoes != null); 
} 
} 
public void ModificaEstado(Intervencao intervencao){ 
//some checks removed 
intervencao.Ocorrencia = this; 
_intervencoes.Add(intervencao); 
} 
//more code removed 

} 
public class Intervencao : EntityWithAction, IHasAssignedDomainAction { 
//other code remove 
internal Ocorrencia Ocorrencia { get; set; } 
} 

而这里的映射(唯一重要的事情):

public class IntervencaoMapping: ClassMap<Intervencao> { 
public IntervencaoMapping() 
{    
    WithTable("Intervencoes"); 
    Not.LazyLoad(); 
    Id(intervencao => intervencao.Id) 
     .ColumnName("IdIntervencoes") 
     .WithUnsavedValue(0) 
     .SetGeneratorClass("identity"); 
    Map(intervencao => intervencao.Guid, "Guid") 
     .Not.Nullable(); 
    Version(ent => ent.Version) 
     .ColumnName("Version"); 
    References(ent => ent.Action, "IdAccao") 
     .Cascade 
     .SaveUpdate(); 
    Map(intervencao => intervencao.TipoEstado, "TipoEstado") 
     .CustomTypeIs(typeof (TipoEstado)) 
     .CustomSqlTypeIs("integer"); 
    Map(intervencao => intervencao.Observacoes, "Observacoes"); 
    References(intervencao => intervencao.Ocorrencia, "IdOcorrencias") 
      .Not.LazyLoad(); 
} 
} 
public class OcorrenciaMapping: ClassMap<Sra.Ocorrencias.Ocorrencia> { 
public OcorrenciaMapping() 
{    
    WithTable("Ocorrencias"); 
    Not.LazyLoad(); 
    Id(ocorrencia => ocorrencia.Id) 
     .ColumnName("IdOcorrencias") 
     .WithUnsavedValue(0) 
     .SetGeneratorClass("identity"); 
    Map(ocorrencia => ocorrencia.Guid, "Guid") 
     .Not.Nullable(); 
    Version(ocorrencia => ocorrencia.Version) 
     .ColumnName("Version"); 
    Map(ocorrencia => ocorrencia.Descricao) 
     .ColumnName("Descricao"); 
    Map(ocorrencia => ocorrencia.Nif, "Nif") 
     .Not.Nullable(); 
    Map(ocorrencia => ocorrencia.TipoOcorrencia, "TipoOcorrencia") 
     .CustomTypeIs(typeof(TipoOcorrencia)) 
     .CustomSqlTypeIs("integer"); 
    Map(ocorrencia => ocorrencia.BalcaoEntrada, "Balcao") 
     .CustomTypeIs(typeof(TipoBalcao)) 
     .CustomSqlTypeIs("integer") 
     .Not.Nullable(); 

    References(ocorrencia => ocorrencia.Organismo, "IdOrganismos") 
     .Cascade.None() 
     .Not.Nullable(); 
    HasMany(ocorrencia => ocorrencia.Intervencoes) 
      .Access.AsCamelCaseField(Prefix.Underscore) 
      .AsBag() 
      .Cascade 
      .All() 
      .KeyColumnNames.Add("IdOcorrencias") 
      .Not.LazyLoad(); 
} 
} 

正如你所看到的,Interncao对象通过ModificaEstado方法添加,确保Intervencao上的Ocorrencia参考“指向”Ocorrencia的参考。现在,我如何测试与PersistenceSpecification对象的这种关系?我已经结束了与下面的代码:

[Test] 
public void Test() { 
using (var session = _factory.GetSession()) { 
    using (var tran = session.BeginTransaction()) { 

     var accao = CreateAction(); 
     session.Save(accao); 

     var organismo = CreateOrganismo(); 
     session.Save(organismo); 

     var intervencao = CreateIntervencao(); 
     ((IHasAssignedDomainAction)intervencao).SetActionTo(accao); 
     var intervencoes = new List<Intervencao> {intervencao}; 

     new PersistenceSpecification<Ocorrencia>(session) 
      .CheckProperty(e => e.Nif, _nif) 
      .CheckProperty(e =>e.Organismo, organismo) 
      .CheckProperty(e => e.Descricao, _descricao) 
      .CheckProperty(e => e.TipoOcorrencia, TipoOcorrencia.Processo) 
      .CheckList(e => e.Intervencoes, intervencoes) 
      .VerifyTheMappings()); 

      tran.Rollback(); 
    } 
} 
} 

由于IdOcorrencia被定义为表Intervencoes外部键,原来的代码,因为它试图插入intervencoes清单,IdOcorrencia设置为null失败。如果我删除外键,那么测试工作正常,但我相信我不应该那样做。

我可能做错了什么,但我不知道那是什么。所以,任何人都可以提供足够的信息,并告诉我如何解决这个问题?

谢谢你们。 Luis

回答