0

我有桌子:

玩家
ID:int - 主键
名称:字符串

BowlerType
Id:int-primarykey
描述:字符串

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

4

2 回答 2

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 个单独的错误)。这里讨论其中之一。

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

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

于 2011-12-11T18:47:42.557 回答
0

我认为我们可以使用 HasManytoMany。根据您的要求,您必须创建一个包含玩家和投球手类型 ID 的表。这有一个多对多的关系。

如果您查看此站点:https ://github.com/jagregory/fluent-nhibernate/wiki/Getting-started Store 和 Products 的映射与您的预期映射相同。 在此处输入图像描述

于 2013-08-17T11:02:39.183 回答