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?