2010-11-19 7 views
0

У меня возникла проблема, отображающая отношение «много-к-одному» от абстрактного сопоставления базового класса к конкретному объединению-подклассу. Пример:Сопоставление связей NHibernate от абстрактных базовых классов до union-subclasses

public abstract class Entity 
{ 
    public virtual Guid ID {get; set;} 
    public virtual string Name {get;set;} 
    public virtual User OwnerUser {get; set;} 
} 

public class User : Entity 
{ 
    public virtual string UserName {get; set;} 
} 

Как вы можете видеть здесь, у меня есть базовый абстрактный класс для всех объектов моей базы данных. Я сопоставляю эти классы с классом Entity как с классом абстрактного отображения, так и с пользователем как объединенным подклассом. При создании объекта конфигурации не возникают ошибки и экспорт схемы очень хорош. Однако поле для OwnerUser просто не будет отображаться в базе данных для всех конкретных классов. Вот пример того, как выглядит отображение

<class entity-name="Entity" name="Entity" abstract="true"> 
    <id name="ID" type="guid"> 
     <generator class="guid.comb"/> 
    </id> 
    <property name="Name" /> 
    <many-to-one name="OwnerUser" column="ID" entity-name="User" /> 
</class> 

<union-subclass name="User" entity-name="User" extends="Entity"> 
    <property name="UserName" /> 
</union-subclass> 

Я также использую экземпляр Oracle XE в качестве базы данных. Если этого недостаточно, чтобы правильно ответить на вопрос, дайте мне знать, и я добавлю, что смогу.

Худший сценарий сценария Я просто добавлю отношения «один-два» ко всем конкретным объектам явно, но это не самое элегантное решение, и я думаю, что то, что я предложил, должно работать. Я не смог найти конкретных примеров этого на трубах, которые влияют на различные сети, и я не нашел ничего в документации, явно заявив, что это недопустимый вариант использования, хотя я мог что-то пропустить. Это было бы не в первый раз: -/

Любые ответы на этот вопрос очень ценятся. Спасибо за ваше время.

ответ

0

Ничего себе, просто ... ничего себе.

Вместо того, чтобы удалять это сообщение, я оставлю его для другого низкого nhibernate noob, чтобы найти один день, так как я не мог найти никаких вопросов в этом конкретном случае использования.

Дело в том, что вы можете сделать это без проблем. Моя проблема заключалась в том, что я указывал ID для атрибута column в элементе отображения «один к одному». По какой-то нечетной причине я думал, что это столбец, на который ссылается внешний ключ (который на самом деле является ссылкой свойства-ref, если я не ошибаюсь). Этот атрибут фактически указывает имя столбца в таблице, в котором содержится ссылка (d'oh!). Удивительно, но NHibernate с радостью сопоставляет несколько элементов отображения с тем же именем столбца без предупреждения. Я не пытаюсь обвинить их, возможно, прецедент для этого допускает некоторый тип переопределения в полиморфном производном классе.

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

Спасибо всем, кто нашел время, чтобы проверить этот пост.

Смежные вопросы