【问题标题】:Fluent NHibernate PropertyNotFoundException for Auto Property自动属性的流利 NHibernate PropertyNotFoundException
【发布时间】:2010-10-29 17:45:16
【问题描述】:

我正在尝试让 Fluent NHibernate 为我映射一个集合。我的类定义如下:

public abstract class Team 
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}

public class ClientTeam : Team
{
    public virtual IEnumerable<Client> Clients { get; set; }
}

public class Client
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Identifiers { get; set; }
}

我的映射:

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        Table("Team");
        Id(x => x.Id).GeneratedBy.Assigned();
        Map(t => t.TeamName);
    }
}

public class ClientTeamMap : SubclassMap<ClientTeam>
{
    public ClientTeamMap()
    {
        HasMany(t => t.Clients);
    }
}

public class ClientMap : ClassMap<Client>
{
    public ClientMap()
    {
        Table("Client");
        Id(c => c.Id);
        Map(c => c.Name);
        Map(c => c.Identifiers);
    }
}

我已经构建了一个单元测试,它实例化了一个团队,然后尝试将其持久化(测试库中有依赖配置等):

public class TeamMapTester : DataTestBase
{
    [Test]
    public void Should_persist_and_reload_team()
    {
        var team = new ClientTeamDetail
        {
            Id = Guid.NewGuid(),
            TeamName = "Team Rocket",
            Clients = new[] 
            {
                new ClientDetail {ClientName = "Client1", ClientIdentifiers = "1,2,3"}
            }
        };

        using (ISession session = GetSession())
        {
            session.SaveOrUpdate(team);
            session.Flush();
        }

        AssertObjectWasPersisted(team);
    }
}

当我运行测试时,我得到这个错误:

SetUp : FluentNHibernate.Cfg.FluentConfigurationException : 创建 SessionFactory 时使用了无效或不完整的配置。查看PotentialReasons 集合和InnerException 了解更多详情。

  • 数据库未通过数据库方法配置。

----> NHibernate.MappingException:无法编译映射文档:(XmlDocument)
----> NHibernate.PropertyNotFoundException:在类“ClientTeam”中找不到字段“_clients”`

我查看了 NHibernate 文档并进行了一些谷歌搜索,但我找不到任何似乎可以解决此问题的内容。 Fluent NHibernate 的引用方法的文档明确使用了自动属性,所以我确信这不是问题。

为什么 NHibernate 会认为 _clients 是它在这种情况下应该映射的字段?

【问题讨论】:

  • 我怀疑我们遗漏了一些关键部分。 _clients 必须在某处定义。自动属性 ​​Clients 没有 _clients 作为其字段实现。那么问题就变成了:为什么 Fluent 会认为某处有一个字段_clients
  • 这是一个很好的观点;我已经更新了问题以反映这一点。我回去查看文档 (wiki.fluentnhibernate.org/Fluent_mapping),他们的所有示例都使用自动属性。

标签: c# fluent-nhibernate automatic-properties


【解决方案1】:

而原因竟然是:Conventions。

Fluent 映射被设置为通过要求支持字段来尝试强制执行只读集合属性。有问题的ICollectionConvention

public class CollectionAccessConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance)
    {
        instance.Fetch.Join();
        instance.Not.LazyLoad();
        instance.Access.CamelCaseField(CamelCasePrefix.Underscore);
    }
}

这要求集合支持字段为驼峰式并以下划线开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多