2012-03-18 191 views
9

在我的MSSQL中,我有两个表,Property和Photo。流利Nhibernate映射hasMany

为了缩短我在这里只写几个字段。 属性表

Id int not null 
Title nvarchar(255) not null 
PhotoId int not null 

照片表

Id int not null 
ImageData varbinary(MAX) null 
ImageMimeType varchar(50) null 

关系如下:

FK_Property_Photo

Primary Key table  Foreign key table 
-------------------------------------------- 
Photo     Property 
-------------------------------------------- 
Id      PhotoId 

你可以想像一个属性可以有一个或多个图像。一个图像可以属于一个或多个属性。

我试着用这种映射

public PropertyMap() 
{ 
    Table("Property"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Title).Length(255).Not.Nullable(); 
    HasMany(x => x.Photos).KeyColumn("Id"); 
} 

public PhotoMap() 
{ 
    Table("Photo"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Version); 
    Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000); 
    Map(x => x.ImageMimeType); 
} 
+1

你应该添加标签'fluent-nhibernate',plz。 – dwerner 2012-03-18 19:25:02

+0

你想让协会出现在哪一边?我会看看流利的文档,我更喜欢自己的xml映射:S。 – dwerner 2012-03-18 19:44:56

+0

如何将多张照片与一个物业关联?有没有你没有提到的“链接”表? – 2015-08-12 19:50:56

回答

12

的你想利用References and HasMany协会。你已经在使用HasMany,所以得到另一个关联:

public PropertyMap() 
{ 
    Table("Property"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Title).Length(255).Not.Nullable(); 
    HasMany(x => x.Photos).KeyColumn("Id"); // you were already doing this 
} 

public PhotoMap() 
{ 
    Table("Photo"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Version); 
    Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000); 
    Map(x => x.ImageMimeType); 
    References(x => x.Property) // you'll need 'Property' in your class definition too 
     .Column('PhotoId') 
     .Cascade.All(); 
} 
+0

不错的工作,谢谢 – BobRock 2012-03-18 20:03:07

+0

不客气。现在,当我看到它们时,我可能会理解流利的映射。 :) – dwerner 2012-03-18 20:03:49