Fluent NHibernate将引用映射到不是ID列的列

时间:2010-01-14 18:27:25

标签: nhibernate fluent-nhibernate s#arp-architecture

我正在使用Fluent Nhibernate 1.0和Sharp Architecture 1.0

目前我正在尝试将引用映射到ZipCode类。我映射的当前类具有ZipCode列,但是zipcode类比基本zipcode所需的更广泛,因此这背后的原因。 (基本上Zipcode类包含lat。和long.UTC时区等,所有内容都是readonly)

这是我的映射

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

当我运行测试时,我收到此错误。

  

初始化方法CountryRepositoryTests.SetUp抛出异常。 System.Data.SqlClient.SqlException:System.Data.SqlClient.SqlException:列'ZipCode.ZipCodeID'与外键'FK8C1490CB2993CD44'中引用列'Address.ZipCode'的数据类型不同。   无法创建约束。查看以前的错误..

我尝试添加ForeignKey和Constrained lambdas,但它们似乎没有添加任何内容。

邮政编码表有一个ID,但我不想映射到那个,而是我要映射到zipcode表的zipcode列,回到地址表的zipcode列。

如果有人有任何想法我可以解决这个问题,我会非常感激。

请注意,正如我上面所做的那样,我不能简单地引用zipcode表并删除地址上的属性,因为zipcode表是只读的。

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

这是地址类

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

这是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();

1 个答案:

答案 0 :(得分:6)

显然HasOne是这样做的正确方法....即使我以为我试过了,我也错过了PropertyRef ......

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