Решить проблему Nhibernate OneToManyKeyColumnApplier - PullRequest
3 голосов
/ 30 ноября 2010

Я использую ConfORM Nhibernate в одном из моих проектов MVC.И были проблемы с отображениями «один ко многим».

        IEnumerable<Type> domainEntities = this.GetDomainEntities();

        var relationalMapper = new ObjectRelationalMapper();
        relationalMapper.TablePerConcreteClass(domainEntities);
        relationalMapper.Patterns.PoidStrategies.Add(new NativePoidPattern());
        relationalMapper.Cascade<Category, Product>(Cascade.All);
        relationalMapper.ManyToMany<Category, Product>();
        relationalMapper.Cascade<Order, Product>(Cascade.Persist);

        var mapper = new Mapper(relationalMapper);
        var englishInflector = new EnglishInflector();

        mapper.PatternsAppliers.Merge(new ClassPluralizedTableApplier(englishInflector));
        mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper));
         .....

        HbmMapping mapping = mapper.CompileMappingFor(domainEntities);

И классы Order и User: у одного пользователя было много Orders.

 public class Order : BaseEntity
{
    public Order(User user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        this.User = user;           
    }

    protected Order()
    {
    }

    public virtual User User { get; protected set; }       
}

And Users:

 public class User : BaseEntity
{
    public User()
    {
        this.Orders = new HashedSet<Order>();
    }

    public virtual string FirstName { get; set; }       

    public virtual ISet<Order> Orders { get; protected set; }
}

Я ожидаю такие отношения: Orders.UserId -> User.Id в БД.Но когда Nhibernate сгенерировал DB, у нас возникла эта проблема (см. Изображение):

table structure

UPS.Двойная ссылка User и UserId неожиданно выросла.И когда мы удалили [пользователь], Nhivernate не смог выполнить внутреннее соединение этих таблиц.Это печально, что двойное время: неверное имя столбца «Пользователь».Неверное имя столбца «Пользователь».

Я думаю, что есть некоторые проблемы с настройкой ConfORM.Если я удалю mapper.PatternsAppliers.Merge (new OneToManyKeyColumnApplier (lationalMapper));Подтвердите генерацию только справочного ключа [User].

Кто-нибудь знает, в чем здесь проблема?Заранее спасибо.

1 Ответ

2 голосов
/ 30 ноября 2010

Вам необходимо добавить следующий аппликатор

mapper.PatternsAppliers.Merge(new ManyToOneColumnApplier());

Возможно, это потому, что имя столбца изменилось со стороны пользователей, но не изменилось со стороны заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...