代码之家  ›  专栏  ›  技术社区  ›  mathieu

NHibernate将子类转换为父类

  •  1
  • mathieu  · 技术社区  · 14 年前

    假设以下实体:

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

    var user = new AppUser() { Login = "test" };
    session.Save( user ); // let's say Id = 1
    

    我怎样才能在保持同一个ID的情况下将它投射/转换/提升给一个人?

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

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Max Schilling    14 年前

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

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

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

        2
  •  1
  •   Community dbr    7 年前

    discussed on SO before 我引用乔恩·斯凯特的话给后人听:

    不。对派生类的引用 你希望它表现如何?

    object o = new object();
    string s = (string) o;
    int i = s.Length; // What can this sensibly do?
    

    基类型的实例 派生类型,我建议你写一个 方法来创建适当的 派生类型实例。或者看看你的眼睛 再次创建继承树并尝试 重新设计,这样你就不需要 首先是这个。