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_Interface_Mapping_Fluent - Fatal编程技术网

C# 流利的NHibernate,使用接口

C# 流利的NHibernate,使用接口,c#,nhibernate,interface,mapping,fluent,C#,Nhibernate,Interface,Mapping,Fluent,我刚切换到Fluent NHibernate,遇到了一个问题,没有找到任何相关信息 情况是这样的: public class Field : DomainObject, IField { public Field() { } public virtual string Name { get; set; } public virtual string ContactPerson { get; set; } public virtual bool

我刚切换到Fluent NHibernate,遇到了一个问题,没有找到任何相关信息

情况是这样的:

public class Field : DomainObject, IField
{
    public Field()
    {  
    }

    public virtual string Name { get; set; }
    public virtual string ContactPerson { get; set; }
    public virtual bool Private { get; set; }
    public virtual IAddress Address { get; set; }  
}
IadAddress是由名为Address的类实现的接口

public class Address : DomainObject, IAddress
{
    public Address()
    {
    }

    public virtual string City { get; set; }
    public virtual string Country { get; set; }
    public virtual string PostalCode { get; set; }
    public virtual string StreetAddress { get; set; }
}
这是两个类的映射文件

地址

public class AddressMap : ClassMap<Address>
{   
    public AddressMap()
    {
        WithTable("Addresses");
        Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid();
        Map(x => x.City, "City");
        Map(x => x.Country, "Country");
        Map(x => x.PostalCode, "PostalCode");
        Map(x => x.StreetAddress, "StreetAddress");
    }
}
公共类地址映射:类映射
{   
公共地址映射()
{
附表格(“地址”);
Id(x=>x.Id,“Id”).Access.AsCamelCaseField(前缀.下划线).GeneratedBy.Guid();
地图(x=>x.城市,“城市”);
地图(x=>x.国家,“国家”);
Map(x=>x.PostalCode,“PostalCode”);
Map(x=>x.StreetAddress,“StreetAddress”);
}
}

公共类字段映射:类映射
{
公共领域地图()
{
WithTable(“字段”);
Id(x=>x.Id,“Id”).Access.AsCamelCaseField(前缀.下划线).GeneratedBy.Guid();
映射(x=>x.Name,“Name”);
映射(x=>x.ContactPerson,“ContactPerson”);
Map(x=>x.Private,“Private”);
引用(x=>x.Address,“AddressId”).Cascade.Delete().Cascade.SaveUpdate();
}
}
因此,当我试图从数据库中检索字段对象时,我得到一个NHibernate错误,该错误表示IAddress未映射。有没有办法指定NHibernate在映射中使用Address类

如果需要更多信息,请告诉我

非常感谢


Charles

在字段对象上,您有一个IADRESS类型的对象。这可以通过任意数量的不同实现来实现。根据您的要求,每个实现都有自己的映射,这将给NHibernate带来许多困难(不可能?)

一个简单的例子有助于说明。假设您有两个地址1和地址2。它们分别保存在各自的表TBladdress 1和TBladdress 2中。当您尝试加载Field对象时,NHibernate只知道您有一些实现了IAddress的东西,它不知道是哪个实现被持久化了。它如何知道使用哪个映射来检索任何给定字段的子对象


我确信会有更多的复杂情况,但这个例子说明了为什么必须为您声明的对象的确切类型创建映射。

我发现使用接口而不是具体类作为属性是有充分理由的

例如,如果您的Field类位于Address类的单独项目中,并且您对Address类的项目与Field类的项目没有依赖关系

处理这种情况还有其他方法,但最简单的方法通常是尝试您正在做的事情,并明确地告诉NHibernate要用于iAdress的具体类

现在可以在Fluent NHibernate中执行此操作,如下所示:

References(x => x.Address, "AddressId")
    .Class(typeof(Address);

不幸的是,你不能用HasMany或HasManyToMany来做这件事。我不确定这是否可能,因为C#中缺乏良好的协方差支持。

如果您有兴趣将ORM完全与域层分离,并在整个数据层中引用接口,而不是指定具体的类,则可以实现EmptyInterceptor以在两者之间映射


请参阅我的答案。

您如何在数据库中建模IAddress层次结构?每个层次结构的表(一个包含所有类型地址的表),还是每个具体类的表?您说您切换到了Fluent,因此发布一个XML映射示例可能有助于确定您要完成的任务。事实上,我使用Fluent Nhibernate从ADO.NET实体框架切换到了Nhibernate。在我的数据库中,有一个包含所有类型地址的表。顺便说一句,我决定删除这些接口,我意识到它是无用的。但我认为这个问题仍然有效。谢谢,CharlesUpdate:您可以使用
引用(x=>x.Address).Column(“AddressId”)通过添加泛型类型参数,您可以对“HasMany”和“HasManyToMany”执行相同的操作。非常感谢,这正是我想要的。。。尝试将.CollectionType()链接到my HasMany(),但似乎不起作用。更新为+1<代码>有许多(s=>s.Features).KeyColumn(“SiteId”)其中s.Features是iFeatureInstanceHanks的集合,它确实帮助迷路的人找到了路。@cbp感谢您的回复。这是可能的。使用ReferencesAny。看看然后使用AddMetaValue注册实例化接口的每个类。
References(x => x.Address, "AddressId")
    .Class(typeof(Address);