C# 有没有办法让fluent nhibernate比较ValueObject';使用QueryOver将s值转换为字符串?

C# 有没有办法让fluent nhibernate比较ValueObject';使用QueryOver将s值转换为字符串?,c#,nhibernate,fluent-nhibernate,domain-driven-design,C#,Nhibernate,Fluent Nhibernate,Domain Driven Design,根据Vladimir Khorikov关于DDD的一些课程,我将一些原始类属性抽象为ValueObject。例如,我的帐户实体的用户名属性是一个字符串,但为了将其验证为域概念,我创建了一个用户名类型 这导致查询器停止工作,请参阅代码 我收到异常:NHibernate.QueryException:'无法解析属性:Username.Value:PtPro.Domain.Account.Account' // Account.cs public class Account : AggregateRo

根据Vladimir Khorikov关于DDD的一些课程,我将一些原始类属性抽象为ValueObject。例如,我的
帐户
实体的
用户名
属性是一个字符串,但为了将其验证为域概念,我创建了一个
用户名
类型

这导致查询器停止工作,请参阅代码

我收到异常:
NHibernate.QueryException:'无法解析属性:Username.Value:PtPro.Domain.Account.Account'

// Account.cs
public class Account : AggregateRoot
    {
        private string _username;
        public virtual Username Username
        {
            get => (Username)_username;
            set => _username = value;
        }
    } // Rest of class removed for brevity

// AccountMap.cs
    public class AccountMap : ClassMap<Account>
    {
        public AccountMap()
        {
            Id(x => x.Id);

            Map(x => x.Username).CustomType<string>().Access.CamelCaseField(Prefix.Underscore);

            References(Reveal.Member<Account, Client>("Client"))
                .Cascade
                .SaveUpdate();
        }
    } // Rest of class removed

// AccountRepository.cs
        public Account GetWithClientByUsername(string username)
        {
            Account ac = null;
            Client cl = null;
            var account =  _session.QueryOver<Account>(() => ac)
                .JoinAlias(() => ac.Client, () => cl)
                .Where(() => ac.Username.Value == username)
                .SingleOrDefault<Account>();
            return account;
        }

// Username.cs
    public class Username : ValueObject<Username>
    {
        public string Value { get; }

        private Username() { }

        private Username(string value)
        {
            Value = value;
        }

        public static Result<Username> Create(string username)
        {
            username = (username ?? string.Empty).Trim();

            if (username.Length == 0)
                return Result.Fail<Username>("Username is invalid");

            return Result.Ok(new Username(username));
        }

        public static implicit operator string(Username username)
        {
            return username.Value;
        }

        public static explicit operator Username(string username)
        {
            return Create(username).Value;
        }

        protected override bool EqualsCore(Username other)
        {
            return other.Value.Equals(Value);
        }

        protected override int GetHashCodeCore()
        {
            return Value.GetHashCode();
        }
    }
//Account.cs
公共类帐户:AggregateRoot
{
私有字符串\u用户名;
公共虚拟用户名
{
get=>(用户名)\u用户名;
set=>_username=value;
}
}//为简洁起见,已删除类的其余部分
//AccountMap.cs
公共类AccountMap:ClassMap
{
公共帐户映射()
{
Id(x=>x.Id);
Map(x=>x.Username).CustomType().Access.CamelCaseField(前缀.下划线);
参考资料(披露成员(“客户”))
大量
.SaveUpdate();
}
}//已删除类的其余部分
//AccountRepository.cs
公共帐户GetWithClientByUsername(字符串用户名)
{
账户ac=null;
客户端cl=null;
var account=\u session.QueryOver(()=>ac)
.JoinAlias(()=>ac.Client,()=>cl)
.Where(()=>ac.Username.Value==Username)
.SingleOrDefault();
返回帐户;
}
//Username.cs
公共类用户名:ValueObject
{
公共字符串值{get;}
私有用户名(){}
私有用户名(字符串值)
{
价值=价值;
}
公共静态结果创建(字符串用户名)
{
username=(username??string.Empty).Trim();
如果(username.Length==0)
返回结果。失败(“用户名无效”);
返回结果。确定(新用户名(Username));
}
公共静态隐式运算符字符串(用户名)
{
返回username.Value;
}
公共静态显式运算符用户名(字符串用户名)
{
返回Create(username).Value;
}
受保护的覆盖布尔EqualsCore(用户名其他)
{
返回other.Value.Equals(Value);
}
受保护的重写int-GetHashCodeCore()
{
返回值。GetHashCode();
}
}
它似乎非常适合这样的值对象

public class UsernameMap : ComponentMap<Username>
{
    public UsernameMap()
    {
        Map(x => x.Value).Access.CamelCaseField(Prefix.Underscore);
    }
}

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        //Use Component instead of Map for all Username mappings
        Component(x => x.Username);
    }
}
public类UsernameMap:ComponentMap
{
公共UsernameMap()
{
Map(x=>x.Value).Access.CamelCaseField(前缀.下划线);
}
}
公共类AccountMap:ClassMap
{
公共帐户映射()
{
//对所有用户名映射使用组件而不是映射
组件(x=>x.Username);
}
}

NHibernate的查询对象不支持值对象。请尝试hql,它确实支持这样的映射

string query = @"
    from Account a inner join fetch a.Client c
    where a.Username = :userName";

IList<Subscription> subscriptions = _session.CreateQuery(query)
    .SetParameter("userName", username)
    .List<Subscription>();
stringquery=@”
从帐户a内部联接获取a.客户端c
其中a.Username=:Username“;
IList订阅=_session.CreateQuery(查询)
.SetParameter(“用户名”,用户名)
.List();
更多信息: