Отношение один-ко-многим с ограничением UniqueKey - PullRequest
1 голос
/ 27 апреля 2011

Я новичок в Fluent-NHibernate.Моя проблема в том, что я хочу установить отношения «один ко многим» между двумя объектами.Продукт может иметь несколько (уникальных) ревизий, а конкретная ревизия принадлежит только одному продукту.Так, например, Product1 имеет ревизию «a» и ревизию «b», но не может иметь две ревизии «a».Вот как выглядят мои определения классов:

public class Product
{
    public virtual int ID {get; private set;}
    public IList<ProductRevision> revisions { get; set; }

}


public class ProductRevision
{
        public virtual int ID {get; private set;}
        public Product isRevisionOf { get; set; }
        public virtual string revision { get; set; }
}

Вот мое отображение

public class ProductMap : ClassMap<Product>
{

    public ProductMap()
    {

        Id(x => x.ID).Column("ProductNo");
        HasMany(x => x.revisions).Cascade.All();
    }

}

public class ProductRevisionMap : ClassMap<ProductRevision>
{
    public ProductDefinitionFormationMap()
    {
        Id(x => x.ID);
        References(x => x.isRevisionOf).UniqueKey("Product_Revision").Not.Nullable();
        Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable();

}

}

Теперь я получаю избыточный столбец «Product_Id» в таблице ProductRevision.Я получаю что-то не так, определяя отношения на ОБА сторон с hasMany () и reference ().Обычно я не определяю отображение References (...), но оно мне нужно для ограничения uniquekey, не так ли?

Спасибо, Эрик

1 Ответ

0 голосов
/ 27 апреля 2011

Это двунаправленное отношение «один ко многим», и отображение может выглядеть примерно так:

public ProductMap()
{
    Id(x => x.ID).Column("ProductNo");
    HasMany(x => x.revisions)
        .KeyColumn("ProductId") // the name of the FK column in ProductRevision table
        .Inverse() // bi-directional relation
        .Cascade.All();
}

public ProductRevisionMap()
{
    Id(x => x.ID);
    References(x => x.isRevisionOf)
        .Column("ProductId") // column name must match the name specified in Product HasMany
        .UniqueKey("Product_Revision")
        .Not.Nullable();
    Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable();
}

Inverse и KeyColumn - недостающие части этой головоломки.

ThisОтображение создает требуемое ограничение в базе данных, но вам все равно нужно будет проверить это ограничение в бизнес-логике, иначе вы получите SqlException, если в коллекцию ревизий будет вставлена ​​ревизия с повторяющимся именем.

...