流畅的Nhibernate外键映射

时间:2011-12-10 13:27:12

标签: c# foreign-keys fluent-nhibernate fluent-nhibernate-mapping

我有桌子:

播放器
Id:int - primarykey
名称:字符串

BowlerType
Id:int - primarykey
描述:string

PlayerBowlerType
PlayerId:int not null外键引用Player.Id
BowlerTypeId:int not null外键引用BowlerType.Id

玩家可以确认许多保龄球类型。继承了一些示例数据

播放器
1 |彼得
2 |约翰

BowlerType
6 |慢
7 |

PlayerBowlerType
1 | 6
1 | 7
2 | 7

2 个答案:

答案 0 :(得分:1)

这里需要的是一个与您的PlayerBowlerType一起使用的复合ID。此设置应该有效:

public class PlayerBowlerTypeId
{
    public virtual int PlayerId { get; set; }

    public virtual int BowlerTypeId { get; set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as PlayerBowlerTypeId);
    }

    private bool Equals(PlayerBowlerTypeId other)
    {
        if (ReferenceEquals(other, null)) return false;
        if (ReferenceEquals(this, other)) return true;

        return PlayerId == other.PlayerId &&
            BowlerTypeId == other.BowlerTypeId;
    }

    public override int GetHashCode()
    {
        unchecked 
        {
            int hash = GetType().GetHashCode();
            hash = (hash * 31) ^ PlayerId.GetHashCode();
            hash = (hash * 31) ^ BowlerTypeId.GetHashCode();

            return hash;
        }
    }
}

public class PlayerBowlerType
{
    public PlayerBowlerType()
    {
        Id = new PlayerBowlerTypeId();
    }

    public virtual PlayerBowlerTypeId Id { get; set; }
}

public class PlayerBowlerTypeMap : ClassMap<PlayerBowlerType>
{
    public PlayerBowlerTypeMap()
    {
        Table("TABLENAME");

        CompositeId<PlayerBowlerTypeId>(x => x.Id)
            .KeyProperty(x => x.BowlerTypeId, "COLUMNNAME")
            .KeyProperty(x => x.PlayerId, "COLUMNNAME");
    }
}

技术上你可以在没有身份对象的情况下执行此操作(将删除PlayerBowlerTypeId类型并将代码直接放入PlayerBowlerType并进行适当调整),但是我遇到了一些问题(3-4个单独的错误)这样做。其中一个被讨论here

虽然我讨厌更改域对象以补偿ORM系统中的错误,但如果您只使用PlayerBowlerTypeId类型,它将为您节省很多麻烦。

只要您修改映射以使用实际的表和列名称(以及您需要对特定设置的映射执行的任何其他操作),这应该有效。

答案 1 :(得分:0)

我认为我们可以使用HasManytoMany。 根据您的要求,您必须创建一个包含播放器和保龄球类型的ID的表。这有很多很多关系。

如果您要查看此网站:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started Store和Products的映射与您的预期映射相同。 enter image description here