Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# 在Nhibernate中映射本地化表_C#_Nhibernate_Fluent Nhibernate_Nhibernate Mapping_Fluent Nhibernate Mapping - Fatal编程技术网

C# 在Nhibernate中映射本地化表

C# 在Nhibernate中映射本地化表,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我正在构建一个本地化的应用程序。所有数据都需要以不同的语言提供。作为一种存储模型,我尝试使用Nhibernate,因为它比实体框架具有更好的性能。我在数据库中存储一个根节点以获取实体的唯一Id,然后我有第二个表,其中包含每种语言的子节点(locale表) 我的数据库表如下所示: Country Int Id; Country_Locale Int Id; Int CountryId; String LangCode; String Name; City In

我正在构建一个本地化的应用程序。所有数据都需要以不同的语言提供。作为一种存储模型,我尝试使用Nhibernate,因为它比实体框架具有更好的性能。我在数据库中存储一个根节点以获取实体的唯一Id,然后我有第二个表,其中包含每种语言的子节点(locale表)

我的数据库表如下所示:

Country
   Int Id;
Country_Locale
   Int Id;
   Int CountryId;
   String LangCode;
   String Name;

City
   Int Id;
   Int CountryId;
City_Locale
   Int Id;
   Int CityId;
   String LangCode;
   String Name;
我喜欢的实体看起来像

Country
  Int Id (from Coutry table)
  String LangCode (from locale table)
  String Name (from locale table)
  IList<City> Cities (Referenced to City entity)
City
  Int Id (From City table)
  String LangCode (from locale table)
  String Name (from locale table)
  Country Country (Referenced to Country entity)
  Int CountryId (From country table)
国家
Int Id(来自Coutry表)
字符串语言代码(来自区域设置表)
字符串名称(来自区域设置表)
IList城市(参考城市实体)
城市
Int Id(来自城市表)
字符串语言代码(来自区域设置表)
字符串名称(来自区域设置表)
国家(参照国家实体)
Int CountryId(来自国家表)
我意识到我不能映射上面的内容,但这是一种我更喜欢的结构。我如何做这个映射,或者有其他建议

**
编辑数据库表布局,使其更加清晰。

您可以将自己的计算属性添加到实体中,以从城市的子国家检索CountryId等内容,并在城市对象上具有CountryId属性,因为映射器将用实际的国家实体替换该Id字段

public int CountryId { get { return this.Country.Id; } }
不幸的是,如果在数据库的某些表(对我来说似乎不必要的)上保留前缀,而不是在其他表上保留前缀,我认为自动映射将是一件痛苦的事情;如果您可以消除表看起来非常适合自动映射的缺点,请参见其wiki上的本指南:


您可以将自己的计算属性添加到实体中,以从城市的子国家检索CountryId等内容,并在城市对象上具有CountryId属性,因为映射器将用实际的国家实体替换该Id字段

public int CountryId { get { return this.Country.Id; } }
不幸的是,如果在数据库的某些表(对我来说似乎不必要的)上保留前缀,而不是在其他表上保留前缀,我认为自动映射将是一件痛苦的事情;如果您可以消除表看起来非常适合自动映射的缺点,请参见其wiki上的本指南:


我想这里的棘手问题是,您希望从
城市
实体访问您的
国家ID
。我看不出确切的原因,因为你已经有了一个关于你国家的参考资料,只要从你的
城市做
country.Id
,你就会得到它

var countryID = myCityEntity.Country.Id;
顺便说一句,如果你出于某种特殊的原因需要它,你甚至不需要映射它,只需要用一种方式而不是普通的POCO来思考,让实体来做这件事

public int CountryId {
    get {
        return this.Country.Id;
    }
}

我想这里的棘手问题是,您希望从
城市
实体访问您的
CountryId
。我看不出确切的原因,因为你已经有了一个关于你国家的参考资料,只要从你的
城市做
country.Id
,你就会得到它

var countryID = myCityEntity.Country.Id;
顺便说一句,如果你出于某种特殊的原因需要它,你甚至不需要映射它,只需要用一种方式而不是普通的POCO来思考,让实体来做这件事

public int CountryId {
    get {
        return this.Country.Id;
    }
}

我采用了与您第一次尝试使用单独的表类似的方法,最后我坚持使用它,效果非常好。以下是我的Fluent映射文件(我使用的是Fluent NHibernate)和一些从数据库中检索数据的示例代码:

using FluentNHibernate.Mapping;

namespace Core.Mapping
{    
    public class CountryMap : ClassMap<Country>
    {
        public CountryMap()
        {
            Id(x => x.Id);

            Map(x => x.IsoCode)
                .Length(2)
                .Not.Nullable();

            HasMany(x => x.Translations)
                .Fetch.Join()
                .Not.LazyLoad()
                .Cascade.AllDeleteOrphan();
        }
    }
}
使用FluentNHibernate.Mapping;
名称空间核心映射
{    
公共类CountryMap:ClassMap
{
公共国家地图()
{
Id(x=>x.Id);
映射(x=>x.IsoCode)
.长度(2)
.Not.Nullable();
有许多(x=>x.Translations)
.Fetch.Join()
.Not.LazyLoad()
.Cascade.AllDeleteOrphan();
}
}
}
国家/地区翻译实际上存储为一个单独的类/表,我意识到这并不完全是您想要的,但效果非常好,因为最后您有一个表,其中存储了所有翻译。以下是Fluent映射类:

using FluentNHibernate.Mapping;

namespace Core.Mapping
{
    public class CountryTranslationMap : ClassMap<CountryTranslation>
    {
        public CountryTranslationMap()
        {
            Id(x => x.Id);

            Version(x => x.LastModified);

            Map(x => x.Culture)
                .Length(2)
                .Not.Nullable();

            Map(x => x.Name)
                .Length(50)
                .Not.Nullable();

            References(x => x.Country);
        }
    }
使用FluentNHibernate.Mapping;
名称空间核心映射
{
公共类CountryTranslationMap:ClassMap
{
PublicCountryTranslationMap()
{
Id(x=>x.Id);
版本(x=>x.LastModified);
映射(x=>x.Culture)
.长度(2)
.Not.Nullable();
映射(x=>x.Name)
.长度(50)
.Not.Nullable();
参考文献(x=>x.Country);
}
}
}

以下是我的数据访问层中的一些示例,用于通过区域性或ISO代码检索国家(这里我使用的是NHibernate QueryOver语法):

public IList GetAll(字符串区域性)
{
var countryLanguageValue=新CountryTranslation();
IList results=UnitOfWork.CurrentSession.QueryOver()
.Fetch(x=>x.Translations)。急切
.JoinAlias(q=>q.Translations,()=>countryLanguageValue,JoinType.LeftOuterJoin)
.Where(()=>countryLanguageValue.Culture==Culture)
.OrderBy(x=>x.DisplayOrder).Asc
.List();
返回结果;
}
公共国家/地区GetCountryByIsoCode(字符串isoCode)
{
var result=UnitOfWork.CurrentSession.QueryOver()
.其中(x=>x.IsoCode==IsoCode)
.List()
.FirstOrDefault();
返回结果;
}

对于您第一次尝试使用单独的表,我采用了类似的方法,最后我坚持使用,效果非常好。以下是我的Fluent映射文件(我使用的是Fluent NHibernate)和一些从数据库中检索数据的示例代码:

using FluentNHibernate.Mapping;

namespace Core.Mapping
{    
    public class CountryMap : ClassMap<Country>
    {
        public CountryMap()
        {
            Id(x => x.Id);

            Map(x => x.IsoCode)
                .Length(2)
                .Not.Nullable();

            HasMany(x => x.Translations)
                .Fetch.Join()
                .Not.LazyLoad()
                .Cascade.AllDeleteOrphan();
        }
    }
}
使用FluentNHibernate.Mapping;
名称空间核心映射
{    
公共类CountryMap:ClassMap
{
公共国家地图()
{
Id(x=>x.Id);
映射(x=>x.IsoCode)