Я пытаюсь установить отношения 1: 1 в ФН, но это немного болезненно.
Я посмотрел на http://avinashsing.sunkur.com/2011/09/29/how-to-do-a-one-to-one-mapping-in-fluent-nhibernate/, который, казалось, подтвердил, что это должно работать, но эй, он продолжает пытаться вставить записи в дочерние таблицы до родительского, что означает, что дочерние вставки не содержат CustomerId, который требуется как это ограничение внешнего ключа.
Таблица
+-----------------------+ +----------------------+
| tblCustomer | | tblCustomerPhoto |
|-----------------------| |----------------------|
| | 1:1 | |
| CustomerID (PK) |+---->| CustomerID (FK) |
| OtherJunk... | | Photo (Image) |
| | | |
| | | |
+-----------------------+ +----------------------+
Модель
public class Customer
{
public virtual int CustomerID { get; private set; }
/* public virtual Other stuff */
}
public class CustomerPhoto
{
public virtual int CustomerID { get;set;}
public virtual Byte[] Photograph { get; set; }
}
Карты
public class CustomerPhotoMap : ClassMap<CustomerPhoto>
{
public CustomerPhotoMap()
{
Id(x => x.CustomerID)
.Column("CustomerID")
.GeneratedBy.Assigned();
Map(x => x.Photograph)
.CustomSqlType("Image")
.CustomType<Byte[]>()
.Nullable();
}
}
public class CustomerMap : ClassMap<Customer>
{
public CustomerMap()
{
Id(x => x.CustomerID)
.GeneratedBy.Identity()
.Column("CustomerID");
HasOne<CustomerPhoto>(x => x.CustomerPhoto)
.LazyLoad()
.ForeignKey("CustomerID");
}
}
Тест
class CustomerMappingFixture : IntegrationTestBase
{
[Test]
public void CanMapCustomer()
{
new PersistenceSpecification<Customer>(Session)
.CheckReference(x => x.CustomerPhoto, new CustomerPhoto(){ Photograph = Arrange.GetBitmapData(ImageFormat.Jpeg) })
.VerifyTheMappings();
}
}
Теперь для столбца внешнего ключа на CustomerPhoto было установлено значение not-null, и я повторял это в нотации на CustomerPhotoMapping.
На основе (https://stackoverflow.com/a/2286491/529120) я изменил это на nullable и удалил обозначения из отображения.
Независимо от того, возвращается NHibernate
System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
и, кажется, пытается сначала вставить запись CustomerPhoto, передавая ноль в качестве CustomerId; затем создайте запись о клиенте, затем попытайтесь выбрать клиента и фотографию, используя левое внешнее соединение. Который, очевидно, не будет работать, так как ни разу не попытался обновить идентификатор в таблице фотографий.