我有桌子:
播放器
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
答案 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的映射与您的预期映射相同。