Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework ORM从多个数据库表创建单个实体_Entity Framework_Hibernate_Nhibernate_Orm - Fatal编程技术网

Entity framework ORM从多个数据库表创建单个实体

Entity framework ORM从多个数据库表创建单个实体,entity-framework,hibernate,nhibernate,orm,Entity Framework,Hibernate,Nhibernate,Orm,经过良好测试的运行系统已经定义了名为“用户”的实体 现在我需要向用户实体添加一个新属性(例如:Age) 为了安全地执行此操作,我不喜欢对现有的数据库表进行任何更改,因为在我的情况下这是非常危险的。我需要一种以最少的代码更改重建用户实体的方法 因此,我的建议是: 创建一个包含两列(用户id、年龄)的新表(用户年龄) 修改用户实体以添加属性“age”及其getter setter 因此,我的实体(用户)属性将保存到两个不同的表(用户和用户年龄) 加载用户也是类似的 这可能与hibernate有关

经过良好测试的运行系统已经定义了名为“用户”的实体

现在我需要向用户实体添加一个新属性(例如:Age) 为了安全地执行此操作,我不喜欢对现有的数据库表进行任何更改,因为在我的情况下这是非常危险的。我需要一种以最少的代码更改重建用户实体的方法

因此,我的建议是:

  • 创建一个包含两列(用户id、年龄)的新表(用户年龄)
  • 修改用户实体以添加属性“age”及其getter setter
  • 因此,我的实体(用户)属性将保存到两个不同的表(用户和用户年龄)
  • 加载用户也是类似的
这可能与hibernate有关吗

如果没有,还有其他更安全的方法来使用Hibernate


提供此类功能的可用ORM有哪些(nhibernate、entityframwork等…或任何其他ORM)?

是的,有多种方法:

[1] 见JPA二级表。这允许您将一个实体映射到两个或多个表

第2.2.7节:

[2] 创建另一个映射到此新表的实体,例如UserInfo。创建从用户到用户信息的一对一映射。

是。你可以这样做。
我用一个
连接的子类来解决类似的问题

基础

<class name="User" table="Users">
   <id name="Code" type="System.Guid">
      <column name="Code" />
      <generator class="guid.comb" />
    </id>
    ...
</class>
<joined-subclass name="UserExt" extends=User" table="UsersExt">
    <key column="Code" />

    <property name="Age">
        <column name="Age" not-null="true" />
    </property>
</joined-subclass>

...
子类

<class name="User" table="Users">
   <id name="Code" type="System.Guid">
      <column name="Code" />
      <generator class="guid.comb" />
    </id>
    ...
</class>
<joined-subclass name="UserExt" extends=User" table="UsersExt">
    <key column="Code" />

    <property name="Age">
        <column name="Age" not-null="true" />
    </property>
</joined-subclass>

NHibernate的
join
映射正是针对这种情况的

有关详细信息,请参阅和。从文件中:

使用
元素,当一个类的属性与多个表之间存在1对1的关系时,可以将它们映射到多个表

从我的搜索结果来看,似乎也可以使用Entity Framework:。我认为这篇文章是关于Entity Framework v1的,到目前为止情况可能已经发生了变化,但Entity Framework版本的这种映射似乎存在一个重要的限制:

。。。当生成的SQL使用内部联接时,每个表中都需要一条记录。如果您使用的是新模型,这是有意义的,但是如果您要映射到现有的模式和数据,我想这会更加棘手

使用NHibernate,您可以在
连接
映射上设置
可选
属性,告诉它使用外部连接而不是内部连接

optional
(可选-默认为
false
):如果启用,则仅当此联接定义的属性为非空且始终使用外部联接检索属性时,NHibernate才会插入行


你是说冬眠,还是说冬眠?也就是说,您是在.NET还是在Java中工作?我正在对ORM进行一般性分析,所以不必担心Java或.NetB,但您说您已经有了一个“经过良好测试的运行系统”。这个系统是用什么语言运行的?你是说为了实现这一个特性,你愿意扔掉所有好的、已经稳定的代码吗?@JanakaPriyadarshana:你应该在某个时候接受答案。