HasForeignKey通过Complex Type属性的关系

时间:2014-10-01 07:53:33

标签: c# entity-framework entity-framework-6 ef-fluent-api

我有两种复杂的类型:

public class ProductItemIdentifier
{
    public Guid Product_Id { get; set; }
    public string ItemName { get; set; }
}

public class AuctionItemIdentifier
{
    public Guid Auction_Id { get; set; }
    public string ItemName { get; set; }
}

我有一个实体类型:

public class Comment
{
    public Guid Id { get; set; }
    public string Comment { get; set; }

    public ProductItemIdentifier ProductItem { get; set; }
    public AuctionItemIdentifier AuctionItem { get; set; }

    #region Navigation

    public virtual Product Product { get; protected set; }
    public virtual Auction Auction { get; protected set; }

    #endregion
}

这是Configuration

public class CommentConfiguration : EntityTypeConfiguration<Comment>
{
    HasKey(p => p.Id);

    HasOptional(p => p.Product).WithMany().HasForeignKey(p => p.ProductItem.Product_Id).WillCascadeOnDelete(false);
    HasOptional(p => p.Auction).WithMany().HasForeignKey(p => new { p.AuctionItem.Auction_Id }).WillCascadeOnDelete(false);
}

基本上我试图通过Complex Type属性创建一个外键(并且不起作用)。

我得到的错误是:

The properties expression 'p => p.ProductItem.Product_Id' is not valid. The expression should represent a property: C#: 't => t.MyProperty'  VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }'  VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.

有没有办法创建关系,而不直接将外键列添加到Comment实体?

2 个答案:

答案 0 :(得分:1)

这是不可能的。例外已明确表示。

  

表达式应代表属性:C#:'t =&gt; t.MyProperty'

它必须是一个简单的财产。

public class Comment
{
    ...

    public Guid Product_Id { get; protected set; } // simple property
    public virtual Product Product { get; protected set; }
}

配置。

HasOptional(p => p.Product)
    .WithMany()
    .HasForeignKey(p => p.Product_Id) // satisfies the C#: 't => t.MyProperty'
    .WillCascadeOnDelete(false);

使用ProductItemIdentifier标记[ComplexType]课程也无济于事。

答案 1 :(得分:0)

我的解决方案是创建一些虚拟对象

public Guid AuctionItem_Auction_Id 
        {
            get { return AuctionItem.Auction_Id; }
            set { AuctionItem.Auction_Id = value; }
        }

    [ForeignKey("AuctionItem_Auction_Id")]
    public virtual Auction Auction { get; protected set; }