保存childs时nHibernate继承问题

时间:2009-02-27 10:09:20

标签: nhibernate

我遇到了问题: 我有用户:

[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; }
}

和一个ditributor:

 [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; }
}

现在我需要将用户提升为经销商。但我需要保存他的id(系统的其他部分正在使用它)。 我正在获得用户并创建新的经销商。但是,当我试图保存经销商时,我收到了这个错误:

具有相同标识符值的其他对象已与会话关联:ec6f6a9f-a236-4385-835c-7f408a5f594d,实体:MLMCore.Entities.Distributor

我尝试了所有方法(save,SaveOrUpdade,SaveOrUpdateCopy,Update)。但它不起作用。任何想法如何解决它?

1 个答案:

答案 0 :(得分:1)

错误就是它所说的 - 您的会话包含User的实例,并且当您尝试使用该ID保存另一个User(a Distributor)时,NHibernate抱怨。您可以尝试清除会话(session.Clear()),然后再保存Distributor,但我不知道NHibernate是否会成功保存到User < em>和突然显示Distributor表。

如果您可以更改设计,我建议您这样做 - 通常,当您的专业化类型可能发生变化时,您不应该使用继承。在您的域中引入某种Role会更好,更方便。

也许我可以给你一些灵感,即使我不知道你的域名的具体情况:如何让用户只是那样 - User的实例。然后,User可以容纳IList<Role>,您可以将Role专门化为例如DistributorIList<Distributor>(以及相关的其他角色)?

或者让您的公司包含User,每个都指向{{1}}怎么样?