私はこの問題を長い間急いでいます。したがって、問題は、DBシェマの作成中にFluentがエラーを生成することです。外部キー(FK6FF7FBACF647ABE5:CheckListToAttributeLinkItem [ProductUID]))には、参照される主キー(ProductAttributeLink [ProductUID、AttributeEntityUID])と同じ数の列が必要です。
これが私の実体です。そのまま表示しています(略してEquals(object obj)メソッドとGetHashCode()メソッドはありません)。最初に、このエンティティはProductをそのパラメーター(属性)に接続します。つまり、これは多対多の「中間」テーブルです。
public class ProductAttributeLink
{
public virtual Product Product { get; set; }
public virtual AttributeEntity AttributeEntity { get; set; }
}
2番目:このエンティティは継承者です
public class CheckListProductAttributeLinkValue : ProductAttributeLink
{
protected IList<CheckListToAttributeLinkItem> _values = new List<CheckListToAttributeLinkItem>();
public virtual IEnumerable<CheckListToAttributeLinkItem> Values
{
get { return _values; }
}
}
3番目:このエンティティは属性アイテムです
public class AttributeEntityValueListItem
{
public virtual Guid UID { get; set; }
public virtual string Item { get; set; }
public virtual AttributeEntity AttributeEntity { get; set; }
}
このエンティティと以前のエンティティ(CheckListProductAttributeLinkValueとAttributeEntityValueListItem)には多対多が必要です。だから私は「中間」エンティティを作成しました
public class CheckListToAttributeLinkItem
{
public virtual CheckListProductAttributeLinkValue CheckListProductAttributeLinkValue { get; set; }
public virtual AttributeEntityValueListItem AttributeEntityValueListItem { get; set; }
}
マッピング:
public class ProductAttributeLinkMap : ClassMap<ProductAttributeLink>
{
public ProductAttributeLinkMap()
{
CompositeId()
.KeyReference(x => x.Product, "ProductUID")
.KeyReference(x => x.AttributeEntity, "AttributeEntityUID");
DiscriminateSubClassesOnColumn("ClassType").Not.Nullable();
}
}
public class CheckListProductAttributeLinkValueMap : SubclassMap<CheckListProductAttributeLinkValue>
{
public CheckListProductAttributeLinkValueMap()
{
DiscriminatorValue(@"CheckLiskValue");
HasMany(x => x.Values)
.Access.CamelCaseField(Prefix.Underscore)
.KeyColumns.Add("ProductUID")
.KeyColumns.Add("AttributeEntityUID")
.Inverse()
.Cascade.All();
}
}
public class CheckListToAttributeLinkItemMap : ClassMap<CheckListToAttributeLinkItem>
{
public CheckListToAttributeLinkItemMap()
{
CompositeId()
.KeyReference(x => x.CheckLinkProductAttributeLinkValue, "ProductUID", "AttributeEntityUID")
.KeyReference(x => x.AttributeEntityValueListItem, "AttributeEntityValueListItemUID");
}
}
public class AttributeEntityValueListItemMap : ClassMap<AttributeEntityValueListItem>
{
public AttributeEntityValueListItemMap()
{
Id(x => x.UID).GeneratedBy.Guid();
Map(x => x.Item);
References(x => x.AttributeEntity);
}
}