Свободный NHibernate - Отображение один ко многим, используя 2 столбца - PullRequest
0 голосов
/ 13 января 2012

У меня есть схема БД в соответствии с:

Product

  • ID
  • ProductName
  • Описание
  • StoreBrand

ProductVariation

  • VariationID
  • ProductID
  • Размер
  • StoreBrand
  • Цена

Классы, как и ожидалось, выглядят примерно так:

public class Product
{
  public virtual int ID { get; set; }
  public virtual string ProductName { get; set; }
  public virtual string Description { get; set; }
  public virtual string StoreBrand { get; set; }

  public virtual IEnumerable<ProductVariation> Variations { get; set; }
}

public class ProductVariation
{
  public virtual int VariationID { get; set; }
  public virtual int ProductID { get; set; }

  public virtual Product Product {get; set;}      

  public virtual string Size { get; set; }
  public virtual double Price { get; set; }
}

У меня есть такие классы отображения:

public class ProductMapper : ClassMap<Product>
{
  public ProductMapper()
  {
    Id(x => x.ID);
    Map(x => x.ProductName);
    Map(x => x.Description);
    Map(x => x.StoreBrand);

    HasMany(x => x.Variations)
      .KeyColumn("ProductID");
  }
}

public class ProductVariationMapper : ClassMap<ProductVariation>
{
  public ProductVariation()
  {
    Id(x => x.ID);
    Map(x => x.ProductID);
    Map(x => x.Size);
    Map(x => x.Price);

    References(x => x.Product)
      .Column("ProductID");
  }
}

Это вид работы ...

Однако мне нужно связать Product.Brands вместе с ProductVariation.Brands... (и наоборот)

Таким образом, при запросе Product возвращается список его ProductVariations для этого бренда ... (Обратите внимание, ProductVariation не имеет свойства в классе, но имеет столбец для сопоставления)

ProductVariation.ID не является уникальным.Ключом являются ProductVariation.ID и ProductVariation.Brand (в базе данных)

1 Ответ

0 голосов
/ 16 января 2012
public class Product
{
    public virtual int ID { get; set; }
    public virtual string StoreBrand { get; set; }

    public virtual string ProductName { get; set; }
    public virtual string Description { get; set; }

    public virtual IEnumerable<ProductVariation> Variations { get; set; }

    public override Equals(object obj)
    {
        return Equals(obj as Product)
    }

    public override Equals(Product other)
    {
        return (other != null) && (Id == other.Id) && (StoreBrand == other.StoreBrand);
    }

    public override GetHashCode()
    {
        unchecked
        {
            return Id.GetHashCode() * 397 + StoreBrand.GetHashCode();
        }
    }
}

public class ProductVariation
{
    public virtual int ID { get; set; }

    public virtual Product Product {get; set;}      

    public virtual string Size { get; set; }
    public virtual double Price { get; set; }
}

public class ProductMapper : ClassMap<Product>
{
    public ProductMapper()
    {
        // Id alone is not unique, hence compositeId
        CompositeId()
            .KeyProperty(x => x.ID)
            .KeyProperty(x => x.StoreBrand);

        Map(x => x.ProductName);
        Map(x => x.Description);

        HasMany(x => x.Variations)
            .KeyColumn("ProductID", "StoreBrand");
    }
}

public class ProductVariationMapper : ClassMap<ProductVariation>
{
    public ProductVariation()
    {
        Id(x => x.ID);

        Map(x => x.Size);
        Map(x => x.Price);

        References(x => x.Product)
            .Column("ProductID", "StoreBrand");
    }
}
...