如果主键和标识符不在同一列,如何映射表?
本文关键字:一列 映射 何映射 标识符 如果 | 更新日期: 2023-09-27 18:16:49
我必须访问一个遗留数据库,其中我面临以下问题:列'unit_name'被定义为主键,并且是一个字符串,另一个列'id'被定义为一个经典的int标识符。
我的问题是-我如何映射这个正确在流利的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);
}
完整的上下文:
在我寻找文档的过程中,我创建了一个id类,实现了Equals和GetHashCode,但这毕竟可能有点小题大做。
[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;
}
}
这是hibernate的按代码映射,但fluent应该是类似的
域对象类
public class TestEntity
{
public String unit_name { get; set; }
public Int32 id { get; protected set; }
}
映射类
public class TestEntityMap : ClassMapping<TestEntity>
{
public TestEntityMap()
{
Id( x => x.unit_name, map =>
{
map.Column("user_name");
map.Generator(Generators.Assigned);
});
Property(x => x.id, map =>
{
map.Generated(PropertyGeneration.Always);
map.Unique(true);
map.NotNullable(true);
});
}
}