Беглый NHibernate переносит ClassMap Id и SubClassMap Id в ссылочную таблицу? - PullRequest
0 голосов
/ 21 мая 2010

HI

У меня есть следующие объекты, которые я пытаюсь отобразить:

public class Product {
   public int ProductId { get; private set; }
   public string Name { get; set; }
}

public class SpecialProduct : Product {
   public ICollection<Option> Options { get; private set; }
}

public class Option {
   public int OptionId { get; private set; }
}

И следующие сопоставления:

public class ProductMap : ClassMap<Product> {
  public ProductMap() {
    Id( x => x.ProductId );
    Map( x => x.Name );
}

public class SpecialProductMap : SubclassMap<SpecialProduct> {
  public SpecialProductMap() {
    Extends<ProductMap>();
    HasMany( p => p.Options ).AsSet().Cascade.SaveUpdate();
  }
}

public class OptionMap : ClassMap<Option> {
  public OptionMap() {
    Id( x => x.OptionId );
  }
}

Проблема в том, что мои таблицы заканчиваются так:

Product
--------
ProductId
Name

SpecialProduct
--------------
ProductId

Option
------------
OptionId
ProductId          // This is wrong
SpecialProductId   // This is wrong

Должен быть только один ProductId и одна ссылка на таблицу SpecialProduct, но мы получаем «оба» идентификатора и две ссылки на SpecialProduct.ProductId.

Есть идеи?

Спасибо Andy

1 Ответ

1 голос
/ 24 мая 2010

Спасибо всем за отзыв.

Таблицы, которые я хотел, выглядят так:

Product 
-------- 
ProductId 
Name 

SpecialProduct 
-------------- 
ProductId 

Option 
------------ 
OptionId 
SpecialProductId   // Which ends up being just product id, but the FK here is to SpecialtyProduct

Я забыл добавить эту строку в своем исходном вопросе в класс OptionMap:

public class OptionMap : ClassMap<Option> {      
  public OptionMap() {      
    Id( x => x.OptionId );      
    References( x => x.ParentOption );
  }      
} 

Если я тогда использую это вместо этого, оно работает так, как я хочу:

public class OptionMap : ClassMap<Option> {      
  public OptionMap() {      
    Id( x => x.OptionId );      
    References( x => x.ParentOption ).Column( "SpecialProductId" ).Not.Nullable();
  }      
} 

Похоже, что Fluent добавил «ProductId» из-за ссылок и не выяснил, что соответствующий столбец уже был там.

...