0

私はこの問題を長い間急いでいます。したがって、問題は、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);
    }
}
4

0 に答える 0