通过复杂类型属性的HasForeignKey关系

本文关键字:HasForeignKey 关系 属性 类型 复杂 | 更新日期: 2023-09-27 18:25:07

我有两种复杂类型:

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);
}

基本上,我试图通过复杂类型属性创建外键(但不起作用)。

我得到的错误是:

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实体的情况下创建关系

通过复杂类型属性的HasForeignKey关系

这是不可能的。例外情况已经明确说明了这一点。

表达式应表示一个属性:C#:'t=>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);

[ComplexType]标记ProductItemIdentifier类也无济于事。

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

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; }