我遇到了问题: 我有用户:
[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)。但它不起作用。任何想法如何解决它?
答案 0 :(得分:1)
错误就是它所说的 - 您的会话包含User
的实例,并且当您尝试使用该ID保存另一个User
(a Distributor
)时,NHibernate抱怨。您可以尝试清除会话(session.Clear()
),然后再保存Distributor
,但我不知道NHibernate是否会成功保存到User
< em>和突然显示Distributor
表。
如果您可以更改设计,我建议您这样做 - 通常,当您的专业化类型可能发生变化时,您不应该使用继承。在您的域中引入某种Role
会更好,更方便。
也许我可以给你一些灵感,即使我不知道你的域名的具体情况:如何让用户只是那样 - User
的实例。然后,User
可以容纳IList<Role>
,您可以将Role
专门化为例如Distributor
。 IList<Distributor>
(以及相关的其他角色)?
或者让您的公司包含User
,每个都指向{{1}}怎么样?