Tuyên bố từ chối trách nhiệm: Im không phải là chuyên gia NHibernate, tuy nhiên, chúng tôi đang sử dụng nó với Lưu loát trong dự án sắp tới sử dụng SQL Server 2008 R2 và ID phân cấp. Mã dưới đây là những gì chúng tôi đang sử dụng hiện tại trên môi trường dev của chúng tôi và không được kiểm tra đầy đủ/tinh tế. Tôi đã sao chép phần lớn mã từ nơi khác (xin lỗi tôi đã mất liên kết!)
Bạn cần tạo Kiểu do người dùng xác định và sau đó sử dụng nó trong ánh xạ của bạn. Ánh xạ bên dưới là thông thạo, Im không biết cách sử dụng nó bằng ActiveRecord nhưng tôi đoán nó sẽ giống như vậy!
User Defined Loại
namespace YourNamespace {
public class SqlHierarchyIdUserType : IUserType {
public bool Equals(object x, object y) {
if(ReferenceEquals(x, y))
return true;
if(x == null || y == null)
return false;
return x.Equals(y);
}
public int GetHashCode(object x) {
return x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner) {
object prop1 = NHibernateUtil.String.NullSafeGet(rs, names[0]);
if(prop1 == null)
return null;
return SqlHierarchyId.Parse(new SqlString(prop1.ToString()));
}
public void NullSafeSet(IDbCommand cmd, object value, int index) {
if(value == null) {
((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
} else {
if(value is SqlHierarchyId) {
SqlHierarchyId hId = (SqlHierarchyId)value;
((IDataParameter)cmd.Parameters[index]).Value = hId.ToString();
}
}
}
public object DeepCopy(object value) {
if(value == null)
return null;
var sourceTarget = (SqlHierarchyId)value;
SqlHierarchyId copy = SqlHierarchyId.Parse(sourceTarget.ToString());
return copy;
}
public object Replace(object original, object target, object owner) {
return DeepCopy(original);
}
public object Assemble(object cached, object owner) {
return DeepCopy(cached);
}
public object Disassemble(object value) {
return DeepCopy(value);
}
public SqlType[] SqlTypes {
get { return new[] { NHibernateUtil.String.SqlType }; }
}
public Type ReturnedType {
get { return typeof(SqlHierarchyId); }
}
public bool IsMutable {
get { return true; }
}
}
}
thạo Mapping
Map(e => e.YourSqlHierarchyIdProperty)
.Column("YourSqlHierarchyIdFieldName")
.CustomType<SqlHierarchyIdUserType>();
Đọc bài đăng này:
Castle ActiveRecord: Map to IUserType wihtin Class in C#
ActiveR ecord sử dụng thuộc tính [Property] để ánh xạ các kiểu do người dùng định nghĩa. Vì vậy, đối với bạn, nó sẽ trông giống như sau:
public class YourDataObject {
[Property(ColumnType="YourNamespace.SqlHierarchyIdUserType, YourNamespace")
public virtual SqlHierarchyId YourSqlHierarchyIdProperty;
}
Hy vọng điều đó sẽ hữu ích!
Cảm ơn câu trả lời Needles.Dự án này đã được một thời gian trước cho tôi vì vậy tôi không thể nói nếu điều này sẽ làm việc (mặc dù trong nháy mắt nó có vẻ âm thanh). Nếu ai đó kêu trong đó nó hoạt động tôi sẽ đánh dấu nó như là câu trả lời. – JasonCoder