2014-04-12 39 views
2

我有以下表场景:映射外键作为主键功能NHibernate

User 
    - Id  (PK) 
    - Username 

Advert 
    - Id (PK) 
    - Title 

AdvertPhoto 
    - Advert (PK) (Also a FK for Advert table) 
    - Image 

Bid 
    - Advert (PK) (Also a FK for Advert table) 
    - User (PK) (Also a FK for User table) 
    - Value 

好吧,我想这些实体与下面的代码映射:

public class AdvertMapping : BaseMapping<Advert> { 
    public AdvertMapping() : base("Advert") { 
     Id(model => model.Id).Not.Nullable().Unique().GeneratedBy.Identity(); 
     Map(model => model.Title).Not.Nullable().Length(100).Insert().Update(); 
    } 
} 

public class AdvertPhotoMapping : BaseMapping<Advert> { 
    public AdvertPhotoMapping() : base("AdvertPhoto") { 
     Id(model => model.Advert) 
      .Column("Id") 
      .GeneratedBy.Foreign("Advert"); 

     Map(model => model.Description).Nullable(); 
     Map(model => model.Photo).CustomSqlType("image").Not.Nullable(); 
     References(model => model.Advert, "Advert").Not.Nullable().Not.LazyLoad(); 
    } 
} 

public class BidMapping { //: BaseMapping<Bid> { 
    public BidMapping() : base("Bid") { 
     Id(model => model.Advert, "Advert").GeneratedBy.Foreign("Advert"); 
      CompositeId() 
       .KeyReference(model => model.Advert, "Advert") 
       .KeyReference(model => model.User, "User"); 

      Map(model => model.Value).Not.Nullable().Insert().Update(); 
      References(model => model.Advert, "Advert").Not.Nullable().Not.LazyLoad(); 
    } 
} 

好吧,我当Fluent NHibernate尝试引用AdvertPhotoMapping类中的Advert列时我得到一个异常,我不知道BidMapping CompositeId是否已正确映射。

我得到的例外是:

{"Could not determine type for: SYB.Engine.Entities.Advert, SYB.Engine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(Advert)"}

我在做什么错? 谢谢大家!

回答

1

一般来说,这是我怎么会映射一对一的关系:

public class AdvertPhotoMapping : BaseMapping<Advert> { 
    public AdvertPhotoMapping() : base("AdvertPhoto") { 
     Id(model => model.Advert) 
      .Column("Id") 
      .GeneratedBy.Foreign("Advert"); 

     Map(model => model.Description).Nullable(); 
     Map(model => model.Photo).CustomSqlType("image").Not.Nullable(); 
     HasOne(model => model.Advert).Constrained(); 
    } 
} 

public class AdvertMapping : BaseMapping<Advert> { 
    public AdvertMapping() : base("Advert") { 
     Id(model => model.Id).Not.Nullable().Unique().GeneratedBy.Identity(); 
     Map(model => model.Title).Not.Nullable().Length(100).Insert().Update(); 
     HasOne(x => x.AdvertPhoto).Cascade.All(); 
    } 
} 

而且你不需要在BidMapping引用映射。它应该看起来像这样:

CompositeId() 
    .KeyReference(model => model.Advert, "Advert") 
    .KeyReference(model => model.User, "User"); 

    Map(model => model.Value).Not.Nullable().Insert().Update();