Проблема наследования nHibernate при сохранении потомков - PullRequest
1 голос
/ 27 февраля 2009

У меня проблема: У меня есть пользователь:

[Class(Table = "Users", Name = "User")]
public class User
{
    [Id(0, Column = "UserId", Type = "Guid", Name = "Id")]
    [Generator(1, Class = "assigned")]
    public Guid Id { get; set; }

    [Property(Name = "Password", Column = "Password", Type = "String")]
    public string Password { get; set; }

    [Property(Name = "Email", Column = "Email", Type = "String")]
    public string Email { get; set; }
}

И дитрибютор:

 [JoinedSubclass(ExtendsType = typeof(User), Table = "Distributors")]
public class Distributor : User
{

    [Id(0, Column = "DistributorId", Type = "Guid", Name = "Identifier")]
    [Generator(1, Class = "assigned")]
    protected Guid Identifier { get; set; }

    [Property(Name = "Company", Column = "Company", Type = "String")]
    public String Company { get; set; }
}

Теперь мне нужно продвинуть пользователя до дистрибьютора. Но мне нужно сохранить его идентификатор (другие части системы используют его). Я получаю пользователя и создаю нового дистрибьютора. Но когда я пытаюсь сохранить дистрибьютора, я получаю эту ошибку:

другой объект с тем же значением идентификатора уже был связан с сеансом: ec6f6a9f-a236-4385-835c-7f408a5f594d, объекта: MLMCore.Entities.Distributor

Я перепробовал все методы (сохранение, SaveOrUpdade, SaveOrUpdateCopy, обновление). Но это не работает. Есть идеи как это исправить?

1 Ответ

1 голос
/ 27 февраля 2009

Ошибка в том, что он говорит - ваш сеанс содержит экземпляр User с этим идентификатором, поэтому, когда вы пытаетесь сохранить другой User (Distributor) с этим идентификатором, NHibernate жалуется. Вы могли бы попробовать очистить сеанс (session.Clear()) перед сохранением Distributor, но я не знаю, удастся ли NHibernate сохранить User и Distributor Стол внезапно.

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

Возможно, я могу дать вам некоторое вдохновение, даже если я не знаю специфики вашего домена: как насчет того, чтобы позволить пользователям быть просто так - экземплярами User. И тогда, User может содержать IList<Role>, и вы можете специализировать Role, например, в. Distributor (и другие роли, если это актуально)?

Или как насчет того, чтобы ваша компания содержала IList<Distributor>, каждый из которых указывает на User?

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