Fluent NHibernate 将引用映射到非 ID 列的列
-
20-09-2019 - |
题
我正在使用 Fluent Nhibernate 1.0 和 Sharp Architecture 1.0
目前我正在尝试映射对 ZipCode 类的引用。我正在映射的当前类有一个 ZipCode 列,但邮政编码类比基本邮政编码所需的范围要广泛得多,因此这是其背后的原因。(基本上 Zipcode 类包含 lat.又长。UTC 时区等,所有内容都是只读的)
这是我的映射
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”的数据类型不同。无法创建约束。查看之前的错误..
我尝试添加外键和约束 lambda,但它们似乎没有添加任何内容。
邮政编码表有一个 ID,但我不想映射到该 ID,而是想映射到邮政编码表的邮政编码列,再映射回地址表的邮政编码列。
如果有人对我如何解决这个问题有任何想法,我将非常感激。
请注意,正如我上面所做的那样,我不能简单地引用邮政编码表并将属性放在地址上,因为邮政编码表是只读的。
这是 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; }
这是邮政编码表映射
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();
解决方案
显然 HasOne 是执行此操作的正确方法......尽管我以为我尝试过,但我错过了 PropertyRef...
HasOne<ZipCode>(x => x.ZipCodeRadius)
.PropertyRef(x => x.ZipCodeName)
.ForeignKey("ZipCode");
不隶属于 StackOverflow