HasKey Throwing InvalidOperationException - Является ли это ошибкой в ​​Entity Framework Code First? - PullRequest
10 голосов
/ 22 января 2012

Хорошо, я пару часов пялился на экран и понятия не имею, почему я получаю эту ошибку. Я использовал Code First в ряде других проектов и раньше у меня не было проблем с этим ...

Вот ошибка:

System.InvalidOperationException was unhandled by user code
  Message=The properties expression 'sci => sci.ShoppingCartItemId' 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 From { t.MyProperty1, t.MyProperty2 }'.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.ModelConfiguration.Utilities.ExpressionExtensions.GetSimplePropertyAccessList(LambdaExpression propertyAccessExpression)
       at System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1.HasKey[TKey](Expression`1 keyExpression)
       at BillingPlatform.DataLayer.BillingDb.OnModelCreating(DbModelBuilder modelBuilder) in [somepath]\BillingDb.cs:line 57
       at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder()
       at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
       at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
  InnerException: 

Вот код, который выдает ошибку. Первая строка:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{                       
   modelBuilder.Entity<ShoppingCartItem>().HasKey(sci => sci.ShoppingCartItemId);
   modelBuilder.Entity<Product>().HasKey<Guid>(p => p.ProductId);
   modelBuilder.Entity<DependentItemType>().HasKey<Guid>(dit => dit.DependentItemTypeId);
   modelBuilder.Entity<ProductCategory>().HasKey<Guid>(pc => pc.ProductCategoryId);

   base.OnModelCreating(modelBuilder);
}

Вот только класс ShoppingCartItem для справки:

namespace BillingPlatform.Libraries
{
    public class ShoppingCartItem
    {
        /// <summary>
        /// The unique identifier of this shopping cart item.
        /// </summary>        
        public Guid ShoppingCartItemId { get; set; }

        public Product Product { get; set; }

        public decimal Price { get; set; }

        public decimal Tax { get; set; }

        public Guid UserId { get; set; }

        public bool InCart { get; set; }

        public string ProductData { get; set; }

        public DependentItemType DependentItemType { get; set; }

        public string DependentItemId { get; set; }
    }
}

Кто-нибудь понимает, почему Entity Framework выдает эту ошибку? Мое лямбда-выражение:

modelBuilder.Entity<ShoppingCartItem>().HasKey(s => s.ShoppingCartItemId);

супер просто. Я не понимаю, что может пойти не так ... Спасибо за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

11 голосов
/ 22 января 2012

Хорошо, проблема была в том, что мои ученики изначально были просто полями .Code First ожидает свойства .После внесения изменений в код и повторной сборки я все еще получал ту же ошибку.Но как только Visual Studio был вынужден отправить обновленные библиотеки DLL, все работало нормально.

3 голосов
/ 29 августа 2013

Здесь не тот случай (полученный здесь из поиска Google), но, возможно, стоит опубликовать, что это точное исключение также может произойти, если HasKey использует анонимный тип, который определяет собственные имена полей:

HasKey(t => new { KeyField1 = t.KeyField1, KeyField2 = t.KeyField2 });

Должно быть исправлено так:

HasKey(t => new { t.KeyField1, t.KeyField2 });
...