NHibernate将子类转换为父类

NHibernate将子类转换为父类,nhibernate,Nhibernate,假设以下实体: public class AppUser { public virtual int Id { get; set; } public virtual string Login { get; set; } } // Mapped as joined-subclass public class Person : AppUser { public virtual int Age { get; set; } } 如果我创建一个AppUser,并像这样保存它 v

假设以下实体:

public class AppUser
{
    public virtual int Id { get; set; }
    public virtual string Login { get; set; }
}

// Mapped as joined-subclass
public class Person : AppUser 
{
    public virtual int Age { get; set; }
}
如果我创建一个AppUser,并像这样保存它

var user = new AppUser() { Login = "test" };
session.Save( user ); // let's say Id = 1
我怎样才能在保持相同ID的情况下,将其强制转换/转换/升级给某人

现在,我的AppUser表中有一行Id=N。如何用相同的Id填充Person表?我无法删除AppUser并将其重新创建为个人,因为AppUser可能被外键引用

我可以发布一个“手动”SQL插入,但它有点难看

这确实是一个NHibernate问题。我理解,从OOP的角度来看,这没有什么意义,因此除了NHibernate之外,没有其他标签。

这一直是,我引用Jon Skeet的话给后人听:

否。对派生类的引用 必须实际引用的实例 派生类(或null)。否则 你希望它表现如何

例如:

如果您希望能够转换 将基类型的实例添加到 派生类型,我建议你写一个 方法来创建适当的 派生类型实例。或者看看你的 请重新创建继承树并尝试 重新设计,这样你就不需要这样做了 首先是这个


在双向飞碟的例子中,字符串是对象,而对象不是字符串。所以“向上投射”是行不通的。

我不相信nHibernate能够为您解决这个问题。nHibernate将您的数据作为一个对象来处理,特别是对于连接的子类,我不相信有任何内置的东西允许您动态更改子类类型,或者至少更改类型并保留原始ID

我认为最好的办法是编写一个存储过程,在给定ID和新类型的情况下,从子类表中删除所有条目,并向正确的子类表中添加一个新条目

一旦该过程运行,然后在nHibernate中重新加载对象(并确保已丢弃与之相关的任何缓存数据),它现在应该是您想要使用的正确类型,设置其新属性并保存它


这样,您就有了一个相对通用的存储过程,它只会更改子类类型,但您不需要添加所有疯狂的逻辑来处理子类上的各种属性。

也许AppUser应该是一个抽象类?如果从OOP的角度看没有意义,这对ORM来说也没什么意义我就是这么想的。。。看来这次没有被忽视的nhibernate功能来帮助我了!:)好吧,如果你看看nHibernate到底在做什么,你所说的真的打破了模型。。。使用nHibernate,或者通常的ORM,可以将对象映射到数据库表。当您添加一个连接的子类时,您已经稍微扩展了该模型,但它仍然有效,因为现在单个对象和多个表之间仍然存在1:1的关系。当然,你可以用纯SQL做你所说的事情,但是这里的ORM抽象只适用于目前为止……所以,是时候回顾一下设计了!非常感谢。
object o = new object();
string s = (string) o;
int i = s.Length; // What can this sensibly do?