我有两种复杂的类型:
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
实体?
答案 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; }