Отношение HasForeignKey через свойство Complex Type
У меня есть два сложных типа:
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 ответа
Решение
Это невозможно. Исключение сказал, что явно.
Выражение должно представлять свойство: 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);
И маркировка ProductItemIdentifier
класс с [ComplexType]
тоже не поможет
Мое решение состояло в том, чтобы создать несколько фиктивных объектов
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; }