Отношение 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; }
Другие вопросы по тегам