1

我有一个奇怪的问题:每当我查询具有 IList 的实体时,它仍然是空的。可以查询语言实体本身...这与我的复合键有关吗?

NHProf 显示 BOTH 实体都被 sql 查询,但由于某种原因,结果没有链接:-/

这是一些代码:

public class Employee : User
{
    public virtual string firstname { get; set; }
    public virtual string lastname { get; set; }
    public virtual string uid { get; set; }
    public virtual string identity_provider
    public virtual IList<Language> languages { get; set; }
}

对应的映射:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("employee");
        Not.LazyLoad();
        CompositeId()
            .KeyProperty(x => x.uid)
            .KeyProperty(x => x.identity_provider);
        Map(x => x.firstname);
        Map(x => x.lastname);

        HasMany<Language>(x => x.languages)
            .Table("employee_spoken_language")
            .KeyColumns.Add("employee_uid","employee_identity_provider")
            .Inverse().Cascade.All();
    }
}

为了完整起见,这就是“语言”的映射方式:

public class LanguageMap : ClassMap<SpokenLanguage>
{
    public LanguageMap()
    {
        Table("employee_spoken_language");
        Not.LazyLoad();
        CompositeId()
            .KeyProperty(x => x.employee_uid)
            .KeyProperty(x => x.employee_identity_provider)
            .KeyProperty(x => x.name);
        References(x => x.knowledge_level).Column("knowledge_level");
    }
}

无论我改变什么,我的员工实体总是显示language = {}!?这真的让我发疯,我找不到错误。我确保执行查询语言的 sql!我确保数据在数据库中。而且因为我使用的是fluent,我还检查了创建的hmb:

<bag cascade="all" inverse="true" name="languages" table="employee_spoken_language">
  <key>
    <column name="employee_uid" />
    <column name="employee_identity_provider" />
  </key>
  <one-to-many class="Jobportal.Language, wcf, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

希望有人可以对此有所了解...在此先感谢!

问候,马丁

4

1 回答 1

0

这是一个有趣的问题,我在所有项目中都使用 nHibernate,但很少使用复合键。我曾经手动完成所有映射(学习),但现在我使用 Entity Developer 工具来生成它们。我在我的数据库中创建了与您的结构相同的可比较的 Employee 和 Language 表,并在它们上运行 Entity Developer 以为您生成流畅的映射。我在下面列出了这些。我没有看到任何巨大的差异,但知道 nHibernate 有多么挑剔可能值得一试。我可能有一些属性长度错误等,但根据您的特定需求进行调整。

对于员工:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
          Schema(@"dbo");
          Table(@"Employees");
          LazyLoad();
          CompositeId()
            .KeyProperty(x => x.Uid, set => {
                set.Type("String");
                set.ColumnName("uid");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.IdentityProvider, set => {
                set.Type("String");
                set.ColumnName("identity_provider");
                set.Length(50);
                set.Access.Property(); } );
          Map(x => x.Firstname)    
            .Column("firstname")
            .CustomType("String")
            .Access.Property()
            .Generated.Never()
            .CustomSqlType("varchar")
            .Not.Nullable();
          Map(x => x.Lastname)    
            .Column("lastname")
            .CustomType("String")
            .Access.Property()
            .Generated.Never()
            .CustomSqlType("varchar")
            .Not.Nullable();
          HasMany<Language>(x => x.Languages)
            .Access.Property()
            .AsSet()
            .Cascade.None()
            .LazyLoad()
            .Inverse()
            .Generic()
            .KeyColumns.Add("uid", mapping => mapping.Name("uid")
                                                                 .SqlType("varchar")
                                                                 .Not.Nullable()
                                                                 .Length(50))
            .KeyColumns.Add("identity_provider", mapping => mapping.Name("identity_provider")
                                                                 .SqlType("varchar")
                                                                 .Not.Nullable()
                                                                 .Length(50));
    }
}

对于语言:

public class LanguageMap : ClassMap<Language>
{
   public LanguageMap()
    {
          Schema(@"dbo");
          Table(@"Languages");
          LazyLoad();
          CompositeId()
            .KeyProperty(x => x.Uid, set => {
                set.Type("String");
                set.ColumnName("uid");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.IdentityProvider, set => {
                set.Type("String");
                set.ColumnName("identity_provider");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.Name, set => {
                set.Type("String");
                set.ColumnName("name");
                set.Length(50);
                set.Access.Property(); } );
          References(x => x.Employee)
            .Class<Employee>()
            .Access.Property()
            .Cascade.None()
            .LazyLoad()
            .Columns("uid", "identity_provider");
    }
}

让我知道这些工作是否更好,如果没有,我将生成一些测试数据并尝试使用映射对这些表运行一些查询。

要考虑的另一件事是确保您使用的是最新版本的 nHibernate。

于 2013-05-24T08:21:30.690 回答