DbEntityValidationException после обновления до EF 4.1 - PullRequest
2 голосов
/ 28 марта 2011

Сегодня я решил перейти на EF 4.1 (с CTP5). Я использую Code First. К сожалению, всякий раз, когда я пытаюсь запустить проект, я получаю следующее исключение:

System.Data.Entity.Validation.DbEntityValidationException: Проверка не удалась для одного или нескольких юридические лица. Смотрите 'EntityValidationErrors' собственность для более подробной информации.

Свойство EntityValidationErrors на самом деле ничего не говорит о сущностях, которые вызывают исключение. Nether делает трассировку стека на самом деле. Но исключение выдается в строке, где оно говорит context.SaveChanges () внутри переопределения Seed () (в классе инициализатора).

После некоторой отладки и комментирования некоторого кода, я думаю, что это как-то связано с классами User, Item и Rating. Ниже приведен код для этих классов:

public class User 
{
 public int Id { get; set; }
 public string Nickname { get; set; }
 public string FirstName { get; set; }
 public string LastName { get; set; }
 public string Email { get; set; }
 public string Password { get; set; }
 public float Credits { get; set; }
 public float PromotionalCredits { get; set; }
 public string Telephone { get; set; }
 public string Mobile { get; set; }
 public double RatingAverage { get; set; }
 public string ProfileImage { get; set; }
 public int? DefaultAddressId { get; set; }
 [ForeignKey("DefaultAddressId")]
 public virtual Address DefaultAddress { get; set; }
 public virtual ICollection<Address> Addresses { get; set; }
 public virtual ICollection<Role> Roles { get; set; }
 public virtual ICollection<Comment> Comments { get; set; }
 public virtual ICollection<Item> Items { get; set; }
 public virtual ICollection<Bid> Bids { get; set; }
 public virtual ICollection<CreditCard> CreditCard { get; set; }
 public virtual ICollection<Message> ReceivedMessages { get; set; }
 public virtual ICollection<Message> SentMessages { get; set; }
 public virtual ICollection<Item> WatchList { get; set; }
 public virtual ICollection<Item> ViewList { get; set; }
 public virtual ICollection<Rating> OwnRatings { get; set; }
 public virtual ICollection<Rating> RatingsForOthers { get; set; }
}

public class Item
{
 public int Id { get; set; }
 public string Title { get; set; }
 public string Description { get; set; }
 public float StartingPrice { get; set; }
 public float? BidIncrement { get; set; }
 public DateTime StartDate { get; set; }
 public DateTime EndDate { get; set; }
 public int Status { get; set; }
 [ForeignKey("Status")]
 public virtual ItemStatus ItemStatus { get; set; }
 public virtual Address PickupAddress { get; set; }
 public virtual User User { get; set; }
 public virtual ChildCategory Category { get; set; }
 public virtual ICollection<Comment> Comments { get; set; }
 public virtual ICollection<Image> Images { get; set; }
 public virtual ICollection<Bid> Bids { get; set; }
 public virtual ICollection<User> WatchingUsers { get; set; }
 public virtual ICollection<User> ViewingUsers { get; set; }
 public virtual ICollection<Tag> Tags { get; set; }
}

А вот код, в который я добавляю некоторые тестовые данные в базу данных с помощью переопределения Seed ():

    var user1 = new User
    {
    FirstName = "John",
    LastName = "Smith",
    Nickname = "J.Smith",
    Email = "john.smith@live.com",
    Password = "myPassword",
    Mobile = "01542367",
    Telephone = "824225523",
    ViewList = new List<Item>(),
    WatchList = new List<Item>(),
    ReceivedMessages = new List<Message>(),
    SentMessages = new List<Message>(),
    Roles = new List<Role>(),
    RatingsForOthers = new List<Rating>(),
    OwnRatings = new List<Rating>(),
    Bids = new List<Bid>(),
    Credits = 600,
    PromotionalCredits = 20,
    ProfileImage = "http://localhost/Content/images/temp/default_profile.jpg",
    Comments = new List<Comment>(),
    Addresses = new List<Address>
                                            {
                                                new Address
                                                    {
                                                        Area = (from c in districts.ElementAt(2).Cities.ElementAt(0).Areas
                                                                    where c.GoogleName.Equals("Sirhmoul")
                                                                    select c).First(),
                                                        Details = "my address in the street",
                                                        Name = "Home Address"
                                                    }
                                            }
};


      var add1 = (from c in user1.Addresses
       where c.Name.Equals("Home Address")
       select c).First();


      var item1 = new Item
      {
      Title = "HTC Desire",
      Description = "Lorem Ipsum is simply dummy text",
      StartingPrice = 400f,
      User = user1,
      EndDate = DateTime.Now.AddDays(10),
      StartDate = DateTime.Now,
      BidIncrement = 3f,
      Status = 1,
      Bids = new List<Bid>(),
      Comments = new List<Comment>(),
      PickupAddress = add1,
      Images = new List<Image>
         {
         new Image
          {
          Description = "some image description",
          Path = "http://localhost:2732/images/temp/dummyItem.png",
          Rank = 1
          },
          new Image
          {
          Description = "some image2 description",
          Path = "http://localhost:2732/Content/images/temp/dummyItem.png",
          Rank = 2
          },
          new Image
          {
          Description = "some image3 description",
          Path = "http://localhost:2732/Content/images/temp/dummyItem.png",
          Rank = 3
          }
         },
      ViewingUsers = new List<User>(),
      WatchingUsers = new List<User>(),
      Tags = new List<Tag>()

      };


      var electronics = (from c in categories
        where c.Name.Equals("Electronics")
        select c).First();

      var cellPhones = (from c in electronics.Children
        where c.Name.Equals("Cell Phones & PDA's")
        select c).First();
      cellPhones.Items.Add(item1);

ОБНОВЛЕНИЕ: (очистил код и заменил его обновленной версией)

Теперь я уверен, что на самом деле это код, который добавляет элемент, который вызывает исключение. Я закомментировал код, который создает элемент, и добавил экземпляр User в контекст, а затем запустил проект, и он работал просто отлично. Итак, что происходит с кодом, в котором я создаю элемент?

Примечание. У меня не было этой проблемы до обновления до EF 4.1

.

Есть предложения?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011
0 голосов
/ 28 марта 2011

Я заметил, что ваши скалярные свойства не отмечены virtual, но ваши навигационные свойства.Слишком рано утром, чтобы понять, почему это приведет к описанной вами ошибке, но, вероятно, стоит изменить это, чтобы посмотреть, поможет ли это.

...