当前位置:  开发笔记 > 编程语言 > 正文

流畅的NHibernate,使用接口

如何解决《流畅的NHibernate,使用接口》经验,为你挑选了2个好方法。

我刚刚切换到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; }  
}

IAddress是由名为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
{ 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"); } }

领域

public class FieldMap : ClassMap
{
    public FieldMap()
    {
        WithTable("Fields");
        Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid();
        Map(x => x.Name, "Name");
        Map(x => x.ContactPerson, "ContactPerson");
        Map(x => x.Private, "Private");
        References(x => x.Address, "AddressId").Cascade.Delete().Cascade.SaveUpdate();
    }
}

因此,当我尝试从数据库中检索字段对象时,我收到一个NHibernate错误,指出IAddress未映射.有没有办法指定NHibernate在映射中使用Address类?

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

非常感谢,

查尔斯



1> cbp..:

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

例如,如果您的Field类位于Address类的单独项目中,并且您没有从Field类的项目中依赖Address类的项目.

还有其他方法可以处理这种情况,但最简单的方法通常是尝试你正在做的事情,明确告诉NHibernate用于IAddress的具体类.

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

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

很遗憾,你无法使用HasMany或HasManyToMany执行此操作.由于C#缺乏良好的协方差支持,我不确定这是否可行.


**更新:**你可以使用`References
(x => x.Address).Column("AddressId");`你可以通过添加泛型类型参数对'HasMany'和'HasManyToMany'做同样的事情.

2> Luke..:

在Field对象上,您有一个IAddress类型的对象.这可以通过任何数量的不同实现来实现.根据你的要求,每个实现都有自己的映射,这会给NHibernate带来任何困难(不可能?).

一个简单的例子将有助于证明.假设您有两个IAddress实现Address1和Address2.它们各自保存在自己的表tblAddress1和tblAddress2中.当您尝试加载Field对象时,所有NHibernate都知道您有一些实现IAddress的东西,它不知道哪个实现是持久的.如何知道用于检索任何给定字段的子对象的映射?

我确信还有更复杂的问题,但是这个例子说明了为什么必须为已声明的对象的确切类型设置映射.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有