【发布时间】:2014-09-29 09:58:27
【问题描述】:
我必须访问一个遗留数据库,其中我面临以下问题: 一列'unit_name'被定义为主键并且是一个字符串,另一列'id'被定义为一个经典的int标识符。
我的问题是 - 如何在 Fluent NHibernate 中正确映射?
目前我的映射看起来像这样,但我找不到任何适合我的场景的文档,所以我不确定它是否正确。
public InputMap()
{
Table("input");
Map(x => x.unit_name).Not.Nullable().Unique();
//other mappings ...
Id(x => x.id).Column("id").Not.Nullable();
//Maybe use this instead? NaturalId().Property(x => x.unit_name);
}
完整的上下文:
在我寻找文档的过程中,我创建了一个实现 Equals 和 GetHashCode 的 id 类,但这毕竟可能是矫枉过正。
[Serializable]
public class GenericEntityId : EntityId, IEquatable<GenericEntityId>
{
public GenericEntityId(string idString)
{
IdString = idString;
}
public string IdString { get; set; }
private Guid _internalId { get; set; }
protected GenericInoEntityId()
{
_internalId = Guid.NewGuid();
}
public virtual bool Equals(GenericEntityId obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (GetType() != obj.GetType()) return false;
if (!string.IsNullOrEmpty(IdString) )
return obj.IdString == IdString;
return false;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (GetType() != obj.GetType()) return false;
return Equals((GenericEntityId)obj);
}
public override int GetHashCode()
{
if (!string.IsNullOrEmpty(IdString))
{
return (IdString.GetHashCode() * 397) ^ GetType().GetHashCode();
}
else
{
return (_internalId.GetHashCode() * 397) ^ GetType().GetHashCode();
}
}
public static bool operator ==(GenericEntityId left, GenericEntityId right)
{
return Equals(left, right);
}
public static bool operator !=(GenericEntityId left, GenericEntityId right)
{
return !Equals(left, right);
}
}
而EntityId只是一个抽象类:
public abstract class EntityId
{
public abstract override int GetHashCode();
}
创建抽象基础的原因是我想要一个通用基础,我可以将其用于所有存储库,无论它们是否具有字符串主键或复合键(或者可能是标识符)
[Serializable]
public abstract class EntityBase
{
public abstract EntityId entityId { get; }
protected EntityBase()
{
}
}
public class GenericRepository<TEntity> : SessionManagerBase, IEntityRepository<TEntity> where TEntity : EntityBase
{
public TEntity GetById(EntityId id)
{
ISession currentSession = OpenSession;
var returnObject = currentSession.Get<TEntity>(id);
return returnObject;
}
}
【问题讨论】:
标签: c# nhibernate mapping fluent