在Fluent中使用Join和Component NHibernate Mapping会抛出“找不到属性异常的getter”。这是我的C#代码
using FluentNHibernate.Mapping;
namespace FnhTest {
public class CustomerMap : ClassMap<Customer> {
public CustomerMap() {
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
Join("BillingInfo", m =>
{
m.KeyColumn("CustomerId");
m.Component(x => x.BillingInfo, c =>
{
c.Map(y => y.AccountNumber);
c.Map(y => y.Address);
});
});
}
}
public class BillingInfo {
public virtual string AccountNumber { get; set; }
public virtual string Address { get; set; }
}
public class Customer {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual BillingInfo BillingInfo { get; set; }
}
}
这是我的数据库结构=&gt;
Customers:
Id (int)
Name (varchar 50)
BillingInfo:
Id (int)
AccountNumber (varchar 50)
Address (varchar 50)
CustomerId (int) (Foriegn Key to the Customers Id)
Fluent NHibernate为此设置生成正确的映射,但由于某种原因,它会引发错误。下面给出了映射和错误
Mapping:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="FnhTest.Customer, FnhTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Customer`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
<property name="Name" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Name" />
</property>
<join table="BillingInfo">
<key>
<column name="CustomerId" />
</key>
<component name="BillingInfo" insert="true" update="true" optimistic-lock="true">
<property name="AccountNumber" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="AccountNumber" />
</property>
<property name="Address" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Address" />
</property>
</component>
</join>
</class>
</hibernate-mapping>
Error:
TestCase 'M:FnhTest.Program.Main(System.String[])'
failed: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
* Database was not configured through Database method.
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
* Database was not configured through Database method.
---> NHibernate.PropertyNotFoundException: Could not find a getter for property 'AccountNumber' in class 'FnhTest.Customer'
at NHibernate.Properties.BasicPropertyAccessor.GetGetter(Type type, String propertyName)
at NHibernate.Tuple.Component.PocoComponentTuplizer.BuildGetter(Component component, Property prop)
at NHibernate.Tuple.Component.AbstractComponentTuplizer..ctor(Component component)
at NHibernate.Tuple.Component.PocoComponentTuplizer..ctor(Component component)
at NHibernate.Tuple.Component.ComponentEntityModeToTuplizerMapping..ctor(Component component)
at NHibernate.Tuple.Component.ComponentMetamodel..ctor(Component component)
at NHibernate.Mapping.Component.BuildType()
at NHibernate.Mapping.Component.get_Type()
at NHibernate.Mapping.SimpleValue.IsValid(IMapping mapping)
at NHibernate.Mapping.PersistentClass.Validate(IMapping mapping)
at NHibernate.Mapping.RootClass.Validate(IMapping mapping)
at NHibernate.Cfg.Configuration.Validate()
at NHibernate.Cfg.Configuration.BuildSessionFactory()
d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs(93,0): at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()
--- End of inner exception stack trace ---
d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs(100,0): at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()
D:\repositories\core\playground\minhajuddin\FnhTest\FnhTest\Program.cs(8,0): at FnhTest.Program.Main(String[] args)
* Database was not configured through Database method.
0 passed, 1 failed, 0 skipped, took 6.46 seconds (Ad hoc).
我在网上搜索过但无法找到任何有用的信息,我们将非常感谢任何帮助:)
编辑: 好吧,我没有找到一种方法在Fluent NHibernate中做到这一点,我正在使用Torkel发布的任何答案。但是,这不是我的意图。反正。
答案 0 :(得分:2)
BillingInfo看起来不像组件而是实体。
如果您将BillingInfo映射为实体,则可以将其作为关联从Customer映射。
<many-to-one name="BillingInfo" property-ref="CustomerId" cascade="none"/>
property-ref是import,因为您不想加入BillingInfo Id,但是在CustomerId上,这需要您将CustomerId属性添加到BillingInfo类。
答案 1 :(得分:0)
请原谅我,如果这是一个愚蠢的观察,但你不需要BillingInfo中的Id成员吗?