views:

330

answers:

3

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();
A: 

Can you post the classes definitions? so we can see the structure of your entities

Argons
A: 

Moved to header

Matt Braunwart
I didn't copy the county mapping, so please disregard that.
Matt Braunwart
You should move this to the question, information about the question should be in the question part, or at least in your other answer.
Mark Rogers
A: 

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");
Matt Braunwart