如果主键和标识符不在同一列,如何映射表?

本文关键字:一列 映射 何映射 标识符 如果 | 更新日期: 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);
        });
    }
}