Cha*_*let 31 c# mapping nhibernate fluent interface
我刚刚切换到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; }
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的两个类的映射文件
地址
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");
}
}
Run Code Online (Sandbox Code Playgroud)
领域
public class FieldMap : ClassMap<Field>
{
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();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试从数据库中检索字段对象时,我收到一个NHibernate错误,指出IAddress未映射.有没有办法指定NHibernate在映射中使用Address类?
如果需要更多信息,请告诉我.
非常感谢,
查尔斯
cbp*_*cbp 36
我发现使用接口而不是具体类作为属性是有正当理由的.
例如,如果您的Field类位于Address类的单独项目中,并且您没有从Field类的项目中依赖Address类的项目.
还有其他方法可以处理这种情况,但最简单的方法通常是尝试你正在做的事情,明确告诉NHibernate用于IAddress的具体类.
您现在可以在Fluent NHibernate中执行此操作,如下所示:
References(x => x.Address, "AddressId")
.Class(typeof(Address);
Run Code Online (Sandbox Code Playgroud)
很遗憾,你无法使用HasMany或HasManyToMany执行此操作.由于C#缺乏良好的协方差支持,我不确定这是否可行.
在Field对象上,您有一个IAddress类型的对象.这可以通过任何数量的不同实现来实现.根据你的要求,每个实现都有自己的映射,这会给NHibernate带来任何困难(不可能?).
一个简单的例子将有助于证明.假设您有两个IAddress实现Address1和Address2.它们各自保存在自己的表tblAddress1和tblAddress2中.当您尝试加载Field对象时,所有NHibernate都知道您有一些实现IAddress的东西,它不知道哪个实现是持久的.如何知道用于检索任何给定字段的子对象的映射?
我确信还有更复杂的问题,但是这个例子说明了为什么必须为已声明的对象的确切类型设置映射.
归档时间: |
|
查看次数: |
10696 次 |
最近记录: |