Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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
C# 让两个不同的映射文件在同一个域中工作_C#_Nhibernate_Mapping - Fatal编程技术网

C# 让两个不同的映射文件在同一个域中工作

C# 让两个不同的映射文件在同一个域中工作,c#,nhibernate,mapping,C#,Nhibernate,Mapping,我正在开发的应用程序需要支持3个数据库。Sybase、SQL和Oracle 我们现在与Oracle有一个问题。对于oracle,我们使用序列作为id生成器,对于Sybase和oracle,我们使用自己的实现来生成id 我们有一个由双主键组成的表的问题。我的映射文件由复合id组成。但在复合id中,您不能使用生成的值。对于Oracle和Sybase,这没有问题,因为我手动创建了新id。但是对于Oracle,我确实有一个问题,因为需要使用序列 所以我想做的是创建第二个针对Oracle的映射文件,它只使

我正在开发的应用程序需要支持3个数据库。Sybase、SQL和Oracle

我们现在与Oracle有一个问题。对于oracle,我们使用序列作为id生成器,对于Sybase和oracle,我们使用自己的实现来生成id

我们有一个由双主键组成的表的问题。我的映射文件由复合id组成。但在复合id中,您不能使用生成的值。对于Oracle和Sybase,这没有问题,因为我手动创建了新id。但是对于Oracle,我确实有一个问题,因为需要使用序列

所以我想做的是创建第二个针对Oracle的映射文件,它只使用1个字段作为PK。我的查询将不正确,但我看不到任何其他选项可以这样做

因此,我有两个映射文件:

Sybase和SQL:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
    namespace="VS3.Domain.Address" assembly="VS3.Domain">

<class name="Top_Address" table="TOP_ADDRESS">
<composite-id name="ID" class="IDComposite_TopAddress">
  <key-property name="TnrAddress" column="TNR_ADDRESS" type="Int32"/>
  <key-many-to-one name="TopIdentity" class="Top_Identity" column="TNR_ID"/>
</composite-id>

<property name="nmAddress" column="NM_ADDRESS" type="String" not-null="true"/>
<property name="dPosx" column="D_POSX" type="Decimal" not-null="false"/>
<property name="dPosy" column="D_POSY" type="Decimal" not-null="false"/>

<property name="nmStreetAdd" column="NM_STREET_ADD" type="String" not-null="false"/>
<property name="nmStreetAdd2" column="NM_STREET_ADD2" type="String" not-null="false"/>
<property name="nmStreetAdd3" column="NM_STREET_ADD3" type="String" not-null="false"/>

<!-- Added By Transics -->
<property name="HouseNumber" column="CNR_HOUSE_ADD" type="String" not-null="false" />
<property name="BusNumber" column="CNR_BUS_ADD" type="String" not-null="false" />
<property name="PostalCode" column="CNR_ZIP" type="String" not-null="false" />
<property name="City" column="NM_ZIP" type="String" not-null="false" />
<property name="Country" column="COD_COUNTRY" type="String" not-null="false" />
<property name="Email" column="CNR_EMAIL_ADD" type="String" not-null="false" />
<property name="Phone" column="CNR_PHONE_ADD" type="String" not-null="false" />
<property name="CellPhone" column="CNR_GSM_ADD" type="String" not-null="false" />
<property name="NmAddress2" column="NM_ADDRESS2" type="String" not-null="false" />

<property name="Active" column="BOL_ACTIVE_ADD" type="Int32" not-null="false" />
<property name="Language" column="COD_LANG" type="String" not-null="false" />
<property name="AmFrom" column="T_TRB_AM_FROM" type="DateTime" not-null="false" />
<property name="AmUntil" column="T_TRB_AM_UNTIL" type="DateTime" not-null="false" />
<property name="PmFrom" column="T_TRB_PM_FROM" type="DateTime" not-null="false" />
<property name="PmUntil" column="T_TRB_PM_UNTIL" type="DateTime" not-null="false" />
<property name="Remark" column="DES_TRB_REMARK" type="String" not-null="false" />
<property name="ExtraInformation" column="TXT_ADDRESS" type="String" not-null="false" />
<property name="AddressType" column ="COD_ADDRESSTYPE" type="Char" not-null="false" />
<property name="AddressOrPlace" column ="COD_TRB_ADDRESSTYPE" type="String" not-null="false" />

</class>
</hibernate-mapping>

甲骨文:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
    namespace="VS3.Domain.Address" assembly="VS3.Domain">

<class name="Top_Address_Oracle" table="TOP_ADDRESS">
<id name="TnrAddress" column="TNR_ADDRESS" type="Int32">
  <generator class="sequence" />
</id>

<property name="nmAddress" column="NM_ADDRESS" type="String" not-null="true"/>
<property name="dPosx" column="D_POSX" type="Decimal" not-null="false"/>
<property name="dPosy" column="D_POSY" type="Decimal" not-null="false"/>

<property name="nmStreetAdd" column="NM_STREET_ADD" type="String" not-null="false"/>
<property name="nmStreetAdd2" column="NM_STREET_ADD2" type="String" not-null="false"/>
<property name="nmStreetAdd3" column="NM_STREET_ADD3" type="String" not-null="false"/>
<property name="HouseNumber" column="CNR_HOUSE_ADD" type="String" not-null="false" />
<property name="BusNumber" column="CNR_BUS_ADD" type="String" not-null="false" />
<property name="PostalCode" column="CNR_ZIP" type="String" not-null="false" />
<property name="City" column="NM_ZIP" type="String" not-null="false" />
<property name="Country" column="COD_COUNTRY" type="String" not-null="false" />
<property name="Email" column="CNR_EMAIL_ADD" type="String" not-null="false" />
<property name="Phone" column="CNR_PHONE_ADD" type="String" not-null="false" />
<property name="CellPhone" column="CNR_GSM_ADD" type="String" not-null="false" />
<property name="NmAddress2" column="NM_ADDRESS2" type="String" not-null="false" />

<property name="Active" column="BOL_ACTIVE_ADD" type="Int32" not-null="false" />
<property name="Language" column="COD_LANG" type="String" not-null="false" />
<property name="AmFrom" column="T_TRB_AM_FROM" type="DateTime" not-null="false" />
<property name="AmUntil" column="T_TRB_AM_UNTIL" type="DateTime" not-null="false" />
<property name="PmFrom" column="T_TRB_PM_FROM" type="DateTime" not-null="false" />
<property name="PmUntil" column="T_TRB_PM_UNTIL" type="DateTime" not-null="false" />
<property name="Remark" column="DES_TRB_REMARK" type="String" not-null="false" />
<property name="ExtraInformation" column="TXT_ADDRESS" type="String" not-null="false" />
<property name="AddressType" column ="COD_ADDRESSTYPE" type="Char" not-null="false" />
<property name="AddressOrPlace" column ="COD_TRB_ADDRESSTYPE" type="String" not-null="false" />

<many-to-one name="Identity" class="Identity" column="TNR_ID" not-null="true"/>
</class>
</hibernate-mapping>

有没有办法确保这些映射文件使用相同的域类?或者我也需要创建一个新域(就像我现在做的那样)

但这不是一个真正的选择。要做很多工作


有人对此有解决方案吗?

我建议您不要放弃映射,而是: 通过反序列化的映射元数据,在创建SessionFacorty之前,添加所需的修改。我不能给你代码,但在这里你可以抓住这个想法:

创建自定义id生成器,并在此处处理两个关键系统之间的差异:

如果在代码执行过程中只需要一个映射文件,那么同一个域类可以有两个映射文件(我假设,因为使用相同的表和域类同时使用两个不同的数据库将是一场噩梦)。在创建SessionFactory之前,您可以根据参数筛选hbm文件并仅获取所需的文件

Oracle需要一个映射文件,其余需要另一个映射文件,例如
MyEntity.Oracle.hbm.xml
MyEntity.default.hbm.xml
。对于在这两种情况下完全相同的类,只需保持它们的原样,例如
MyCommonEntity.hbm.xml

下面是我在项目中使用的代码的一个稍加修改的示例。(我在这里的另一个问题中发布了另一个版本:)

编辑:

假设您在Oracle或其他模式下都可以访问知识,我将包装
GetTop\u AddressById()
方法并执行以下操作:

public Top_Address GetTop_AddressById(IDComposite_TopAddress id)
{
    if (!oracle)
    {
        return session.CreateCriteria(DB, typeof(Top_Address))
           .Add(Restrictions.Eq("ID.TnrAddress", addressID))
           .Add(Restrictions.Eq("ID.TopIdentity.tnrId", tnrID))
           .Add(Restrictions.Eq("AddressType", 'R')) .UniqueResult<Top_Address>();
    }
    else 
    {
        return session.CreateCriteria(DB, typeof(Top_Address))
           .Add(Restrictions.Eq("TnrAddress", addressID))
           .Add(Restrictions.Eq("AddressType", 'R')) .UniqueResult<Top_Address>();
    }
}
public Top\u Address GetTop\u AddressById(IDComposite\u TopAddress id)
{
如果(!oracle)
{
返回会话.CreateCriteria(DB,typeof(Top_地址))
.Add(Restrictions.Eq(“ID.tnradress”,addressID))
.Add(Restrictions.Eq(“ID.TopIdentity.tnrId”,tnrId))
.Add(Restrictions.Eq(“AddressType”,R')).UniqueResult();
}
其他的
{
返回会话.CreateCriteria(DB,typeof(Top_地址))
.Add(Restrictions.Eq(“tnradress”,addressID))
.Add(Restrictions.Eq(“AddressType”,R')).UniqueResult();
}
}

这可能不太好,但我认为,有两个类用于相同的目的更糟糕。对于所有使用id的CRUD操作,您都需要这样的包装器。当然,您还需要在域类中具有
tnradress
属性。

Hi,感谢您的回答:)我不能使用第一种方法,因为不是整个应用程序都使用Nhibernate。我们仅将其用于应用程序的一部分。创建自定义id生成器也不起作用,因为在复合id中我无法添加生成的值。谢谢:)这已经帮了我一点忙。。在我的域中(正如您在我的映射文件中所看到的),我为PK创建了一个类。我的oracle映射文件并非如此。我使用它来检索服务中的某些值,等等。例如:CreateCriteria(DB,typeof(Top_Address)).Add(Expression.Eq(“ID.tnradress”,addressID)).Add(Expression.Eq(“ID.TopIdentity.tnrId”,tnrId)).Add(Expression.Eq(“AddressType”,“R”)).UniqueResult();如果我这样做而不更改我的域和映射,这会起作用吗?谢谢!这也是我想做的,但希望有更好的解决办法。。
public Top_Address GetTop_AddressById(IDComposite_TopAddress id)
{
    if (!oracle)
    {
        return session.CreateCriteria(DB, typeof(Top_Address))
           .Add(Restrictions.Eq("ID.TnrAddress", addressID))
           .Add(Restrictions.Eq("ID.TopIdentity.tnrId", tnrID))
           .Add(Restrictions.Eq("AddressType", 'R')) .UniqueResult<Top_Address>();
    }
    else 
    {
        return session.CreateCriteria(DB, typeof(Top_Address))
           .Add(Restrictions.Eq("TnrAddress", addressID))
           .Add(Restrictions.Eq("AddressType", 'R')) .UniqueResult<Top_Address>();
    }
}