Question

I am using Fluent Nhibernate 1.0 with Sharp Architecture 1.0

Currently I am trying to map a reference to a ZipCode class. The current class I am mapping has a ZipCode column, but the zipcode class is much more extensive than what is needed for a basic zipcode, hence the reasoning behind this. (Basically Zipcode class contains lat. and long. UTC time zone etc, all things that are readonly)

This is my mapping

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

and when I am running my tests, I am getting this error.

Initialization method CountryRepositoryTests.SetUp threw exception. System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: Column 'ZipCode.ZipCodeID' is not the same data type as referencing column 'Address.ZipCode' in foreign key 'FK8C1490CB2993CD44'. Could not create constraint. See previous errors..

I have tried adding the ForeignKey and the Constrained lambdas, but they seemed to not add anything.

The zipcode tables has an ID, but I do not want to map to that, rather I want to map to the zipcode column of the zipcode table, back to the zipcode column of the address table.

If anyone has any ideas how I can get around this, I would really appreciate it.

Please note as I did above, I can not simply just reference the zipcode table and drop the property on the address because the zipcode table is readonly.

This is the ZipCodeRadius class.

[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; }

This is the Address class

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; }

This is the ZipCode table mapping

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();
Was it helpful?

Solution

Apparently HasOne is the proper way to do this.... Even though I thought I tried it, I was missing the PropertyRef...

            HasOne<ZipCode>(x => x.ZipCodeRadius)
            .PropertyRef(x => x.ZipCodeName)
            .ForeignKey("ZipCode");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top