يجيز nhibernate رسم إشارة إلى عمود ليس عمود المعرف
-
20-09-2019 - |
سؤال
أنا أستخدم Nhibernate Fluent مع بنية حادة 1.0
حاليا أحاول تعيين إشارة إلى فئة zipcode. تحتوي الفئة الحالية التي أقوم بها بتخطيط عمود zipcode ، ولكن فئة Zipcode أكثر شمولاً بكثير مما هو مطلوب لرمز zipcode الأساسي ، وبالتالي السبب وراء هذا. (تحتوي فئة Zipcode بشكل أساسي على Lat. و Long. utc Zone Zone ETC ، كل الأشياء التي يتم قراءتها)
هذا هو رسم الخرائط الخاص بي
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" ليس هو نفس نوع البيانات مثل عنوان العمود المرجعية. لا يمكن خلق قيد. انظر الأخطاء السابقة ..
لقد حاولت إضافة The Foreignkey و Lambdas المقيدة ، لكن يبدو أنها لا تضيف أي شيء.
تحتوي جداول 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; }
هذا هو تعيين جدول الرمز البريدي
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");