2010-01-14 10 views
8

estoy usando Fluido Nhibernate 1.0 con 1.0 Arquitectura de SharpFluido NHibernate mapear una referencia a una columna que no es la columna ID

Actualmente estoy tratando de asignar una referencia a una clase de código postal. La clase actual que estoy mapeando tiene una columna ZipCode, pero la clase de código postal es mucho más extensa que lo que se necesita para un código postal básico, de ahí el razonamiento detrás de esto. (Básicamente clase CP contiene lat. Y largo. Zona horaria UTC etc, todas las cosas que son de sólo lectura)

Ésta es mi mapeo

  References<ZipCode>(x => x.ZipCodeRadius, "ZipCode") 
      .Column("ZipCode") 
      .Cascade.None() 
      //.ForeignKey("FK_ZipCode") 
      .ReadOnly(); 

y cuando estoy corriendo mis pruebas, estoy consiguiendo este error.

Método de inicialización CountryRepositoryTests.SetUp lanzó excepción. System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: La columna 'ZipCode.ZipCodeID' no es del mismo tipo de datos que la columna de referencia 'Address.ZipCode' en la clave externa 'FK8C1490CB2993CD44'. No se pudo crear una restricción. Ver errores previos ..

He intentado agregar la ForeignKey y las lambdas restringidas, pero parecían no agregar nada.

Las tablas de código postal tienen una ID, pero no quiero asignarme a eso, prefiero asignarme a la columna de código postal de la tabla de código postal, volver a la columna de código postal de la tabla de direcciones.

Si alguien tiene alguna idea de cómo puedo evitar esto, realmente lo agradecería.

Tenga en cuenta que como he hecho anteriormente, no puedo simplemente hacer referencia a la tabla de código postal y soltar la propiedad en la dirección porque la tabla de código postal es de solo lectura.

Esta es la clase ZipCodeRadius.

[NotNullNotEmpty, Length(Max = 5)] 
public virtual string ZipCodeName { get; set; } 
[NotNullNotEmpty, Length(Max = 1)] 
public virtual string ZipType { get; set; } 
[NotNullNotEmpty, Length(Max = 10)] 
public virtual string TimeZone{ get; set; } 

public virtual int UTC { get; set; } 

public virtual double Latitude { get; set; } 
public virtual double Longitude { get; set; } 

public virtual County County { get; set; } 

Esta es la clase de dirección

protected Address() { } 

public Address(User UpdateUser) 
    : base(UpdateUser) 
{ 
    this.UpdateUserId = UpdateUser.Id.ToString(); 
} 

//[DomainSignature, NotNullNotEmpty] 
//public virtual string Title { get; set; } 

[NotNullNotEmpty, Length(Max = 50)] 
public virtual string AddressLine1 { get; set; } 

[Length(Max = 50)] 
public virtual string AddressLine2 { get; set; } 

[NotNullNotEmpty, Length(Max = 20)] 
public virtual string City { get; set; } 

public virtual StateOrProvince State { get; set; } 

[NotNullNotEmpty, Length(Max = 10)] 
public virtual string ZipCode { get; set;} 

[Length(Max = 10)] 
public virtual string ZipPlus { get; set; } 

public virtual bool IsVerified { get; set; } 

public virtual Country Country { get; set; } 

public virtual ZipCode ZipCodeRadius { get; set; } 

Este es el mapeo de la tabla ZipCode

Table("ZipCode"); 

Id(x => x.Id, "ZipCodeID"); 

Map(x => x.ZipCodeName, "ZipCode").AsVarChar(5); 
Map(x => x.ZipType, "ZipType").AsVarChar(1); 
Map(x => x.TimeZone, "TimeZone").AsVarChar(10); 
Map(x => x.UTC, "UTC"); 
Map(x => x.Latitude, "Latitude"); 
Map(x => x.Longitude, "Longitude"); 

ReadOnly(); 
Cache.ReadOnly(); 

Respuesta

6

Al parecer hasOne es la forma correcta de hacer esto .... A pesar de que pensé lo intenté, me faltaba el PropertyRef ...

  HasOne<ZipCode>(x => x.ZipCodeRadius) 
      .PropertyRef(x => x.ZipCodeName) 
      .ForeignKey("ZipCode"); 
Cuestiones relacionadas