更改数据库列时动态更改休眠映射

时间:2020-07-03 09:08:13

标签: c# sql xml service hibernate-mapping

我有一个带有下一个表的数据库(简化了):

TPersons: FId-主键,int-人的ID FName-nvarchar(100)-人名

TOtherFields: FId-主键,int-附加字段的ID FName-nvarchar(100)-数据库中的字段名称

TOther值: FPersonId-外键,int-人的ID FField1,FField2,...-在TOtherFields中定义的字段集。

例如,我们在TOtherFields中有2条记录({1,“ FField1”}和{2,“ FField2”},然后在表TOtherValues中具有列“ FField1”和“ FField2”。

我有2个申请。 第一个应用程序可以更改数据库,添加新的其他字段并填充人员及其其他字段的数据。 第二个应用程序是C#上的一项服务,它使用休眠映射来与此数据库一起使用。

在此示例中,它具有下一个映射文件:

Person.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  assembly="MyApp.Common.Model"
  namespace="MyApp.Common.Model">
  <class name="Person" entity-name="Person" table="TPersons" polymorphism="explicit">
    <id name="Id" column="FId">
      <generator class="native">
        <param name="sequence">SEQ_TPERSONS</param>
      </generator>
    </id>

    <one-to-one name="AddFields" entity-name="AddFields" fetch="join" cascade="all"/>
  </class>
</hibernate-mapping>

AdditionalFields.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  assembly="MyApp.Common.Model"
  namespace="MyApp.Common.Model">
  <class name="AddFields" entity-name="AddFields" table="TOtherValues" polymorphism="explicit">
    <id name="Id" column="FPersonId">
    </id>
    <property name="FField1" not-null="false" access="MyApp.Common.Model.AddFieldsAccessor, MyApp.Common.Model"/>
    <property name="FField2" not-null="false" access="MyApp.Common.Model.AddFieldsAccessor, MyApp.Common.Model"/>
  </class>
</hibernate-mapping>

当我不使用第一个应用程序更改字段时,效果很好。

GET请求的结果:

{
    "AdvancedFields": {
        "Fields": {
            "FOTHER1": "text1",
            "FOTHER2": "02.02.2020"
        },
        "Id": 1,
        "TypeId": "AddFields"
    },
    "Id": 1,
    "TypeId": "Person"
}

当我使用第一个应用程序更改字段时,我应该使此服务正常工作。例如,我在数据库中添加了“ FField3”-将新记录添加到TOtherFields表中,并将新列添加到TOtherValues中。 我的服务应该以某种方式找到答案,并在他的“获取”请求中显示此新字段。也许应该通过服务更改并重新加载此AddFields.hbm.xml,也许我应该在它之前添加“ FField3”和一些键“ skip-if-not-exists”,或者其他方式。但是我无法重新启动该服务,它应该返回Persons以及数据库中所有其他字段。

0 个答案:

没有答案