gpt4 book ai didi

nhibernate - 将 IUserType 映射到流利的 NHibernate 中的组件属性

转载 作者:行者123 更新时间:2023-12-03 09:35:19 26 4
gpt4 key购买 nike

我正在尝试为州和国家/地区代码实现 IUserType,这将允许我访问两个字母的代码(存储在数据库中的内容)以及全名。我遵循 NHibernate 3.0 Cookbook(第 225 页)中的示例,但我的问题是我的 StreetAddress 类当前映射为我的自动映射配置中的一个组件:

public override bool IsComponent(Type type)
{
return type == typeof(StreetAddress);
}

将此类标识为组件后,我不知道如何将 IUserType 用于组件类的属性,因为该类未明确映射。没有任何地方可以告诉流畅的 NHibernate 使用 IUserType 规范。

最佳答案

@Firo 很接近,但事实证明有一个更简单的解决方案。这里有两步。首先,我必须告诉 Fluent NHibernate 不要映射驻留在我的域层中的 StateCountry 类:

public override bool ShouldMap(Type type)
{
return type.Name != "State" && type.Name != "Country";
}

接下来,我只需为 IUserType 类创建约定。结果证明这比@Firo 建议的要容易:

public class CountryUserTypeConvention : UserTypeConvention<CountryType>
{
}

public class StateUserTypeConvention : UserTypeConvention<StateType>
{
}

那些 IUserTypes 的定义是从原始问题中引用的食谱中提取出来的,但如果您不想阅读它:

public class CountryType : GenericWellKnownInstanceType<Country, string>
{
// The StateType is pretty much the same thing, only it uses "StateCode" instead of "CountryCode"
private static readonly SqlType[] sqlTypes =
new[] {SqlTypeFactory.GetString(2)};

public CountryType()
: base(new Countries(),
(entity, id) => entity.CountryCode == id,
entity => entity.CountryCode)
{
}

public override SqlType[] SqlTypes
{
get { return sqlTypes; }
}
}

并且派生自 GenericWellKnownInstanceType:

[Serializable]
public abstract class GenericWellKnownInstanceType<T, TId> :
IUserType where T : class
{
private Func<T, TId, bool> findPredicate;
private Func<T, TId> idGetter;
private IEnumerable<T> repository;

protected GenericWellKnownInstanceType(
IEnumerable<T> repository,
Func<T, TId, bool> findPredicate,
Func<T, TId> idGetter)
{
this.repository = repository;
this.findPredicate = findPredicate;
this.idGetter = idGetter;
}

public Type ReturnedType
{
get { return typeof (T); }
}

public bool IsMutable
{
get { return false; }
}

public new bool Equals(object x, object y)
{
if (ReferenceEquals(x, y))
{
return true;
}
if (ReferenceEquals(null, x) ||
ReferenceEquals(null, y))
{
return false;
}
return x.Equals(y);
}

public int GetHashCode(object x)
{
return (x == null) ? 0 : x.GetHashCode();
}

public object NullSafeGet(IDataReader rs,
string[] names, object owner)
{
int index0 = rs.GetOrdinal(names[0]);
if (rs.IsDBNull(index0))
{
return null;
}
var value = (TId) rs.GetValue(index0);
return repository.FirstOrDefault(x =>
findPredicate(x, value));
}

public void NullSafeSet(IDbCommand cmd,
object value, int index)
{
if (value == null)
{
((IDbDataParameter) cmd.Parameters[index])
.Value = DBNull.Value;
}
else
{
((IDbDataParameter) cmd.Parameters[index])
.Value = idGetter((T) value);
}
}

public object DeepCopy(object value)
{
return value;
}

public object Replace(object original,
object target, object owner)
{
return original;
}

public object Assemble(object cached, object owner)
{
return cached;
}

public object Disassemble(object value)
{
return value;
}

/// <summary>
/// The SQL types for the columns
/// mapped by this type.
/// </summary>
public abstract SqlType[] SqlTypes { get; }
}

这些类的存储库只是 StateCountry 对象的一对 ReadOnlyCollection。同样,来自食谱:

public class States : ReadOnlyCollection<State>
{
// Truncated in the interest of brevity
public static State Arizona = new State("AZ", "Arizona");
public static State Florida = new State("FL", "Florida");
public static State California = new State("CA", "California");
public static State Colorado = new State("CO", "Colorado");
public static State Oklahoma = new State("OK", "Oklahoma");
public static State NewMexico = new State("NM", "New Mexico");
public static State Nevada = new State("NV", "Nevada");
public static State Texas = new State("TX", "Texas");
public static State Utah = new State("UT", "Utah");

public States() : base(new State[]
{
Arizona, Florida, California, Colorado,
Oklahoma, NewMexico, Nevada, Texas, Utah
}
)
{
}
}

希望这对外面的人有帮助。

关于nhibernate - 将 IUserType 映射到流利的 NHibernate 中的组件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6366956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com