Ошибка с сущностями, которые не предоставляют свойства внешнего ключа для своих отношений - PullRequest
1 голос
/ 23 марта 2011

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

Произошла ошибка при сохранении лица, которые не выставляют иностранные ключевые свойства для их отношения.

А вот и внутреннее исключение:

"Оператор INSERT конфликтует с ограничение FOREIGN KEY \ "Item_ItemStatus \". Конфликт произошло в базе данных \ "CFSharwe \", таблица \ "dbo.ItemStatus \", столбец 'Id'. \ R \ nУказание было прекращается. "* * +1010

Понятия не имею, почему это происходит. Я подозревал, что это может быть вызвано моим классом инициализатора, в котором я загружаю все статическое содержимое базы данных внутри метода Seed (). Поэтому я прокомментировал ту часть, где я добавляю ItemStatuses, и все еще получаю ту же ошибку. Более того, я должен был получить это во время компиляции, а не во время выполнения, нет?

Ниже приведен класс ItemStatus и часть моих тестовых данных:

public class ItemStatus
{
 public int Id { get; set; }
 public string Description { get; set; }
 public ICollection<Item> Items { get; set; }
}

//Test data inside the Index() method of the ItemsController
var item2 = new Item
  {
   Title = "iPhone 4",
   Description = "Lorem Ipsum is simply",
   StartingPrice = 400f,
   User = user2,
   Status = 1,
   EndDate = DateTime.Now.AddDays(10),
   StartDate = DateTime.Now,
   BidIncrement = 3f,
   Bids = new List<Bid>(),
   Comments = new List<Comment>(),
   //ItemStatus = _itemsService.GetItemStatusById(1),    
   ViewingUsers = new List<User>(),
   WatchingUsers = new List<User>(),
   Tags = new List<Tag>()
  };
  //here's where I save the data to the database
  var category = _categoryService.GetChildByName(categoryName);
  category.Items.Add(item2);
  _categoryService.Save();

ОБНОВЛЕНИЕ: (запрошено Слаумой)

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; }
    //public virtual ItemRating Rating { get; set; }

    public bool IsValidBidAmount(int amount)
    {
        if (amount <= this.Bids.Max(a => a.Amount))
            return false;

        return true;
    }

    public bool IsClosed()
    {
        if (this.ItemStatus.Id.Equals(3))
            return true;
        return false;
    }

    public bool IsPending()
    {
        if (ItemStatus.Id.Equals(2))
            return true;
        return false;
    }

    public bool IsPublished()
    {
        if (ItemStatus.Equals(1))
            return true;
        return false;
    }

    public int WinnerId()
    {
        if(IsClosed())
        {
            User highestBidder = null;
            foreach (Bid b in Bids)
            {
                if (b.Amount.Equals(HighestBid()))
                    highestBidder = b.User;
            }
            if (highestBidder != null) return highestBidder.Id;
        }
        return 0;
    }

    public float HighestBid()
    {
        return Bids.Max(u => u.Amount);
    }

    public string MainImageLink()
    {
        var mainImage = Images.Single(i => i.Rank.Equals(0));
        return mainImage.Path;
    }

    public string FirstTag()
    {
        return Tags.First().Title;
    }
}

ОБНОВЛЕНИЕ 2:

public class UnitOfWork : IUnitOfWork
{
    private readonly IDatabaseFactory _databaseFactory;
    private DbContext _context;
    public UnitOfWork(IDatabaseFactory dbFactory)
    {
        _databaseFactory = dbFactory;
    }

    protected DbContext DataContext
    {
        get
        {
            return _context ?? (_context = _databaseFactory.GetDbContext());
        }
    }

    public void Commit()
    {
        DataContext.SaveChanges();
    }
}

public class EfDatabaseFactory : IDisposable, IDatabaseFactory
{
    private SharweEntities _dbContext;


    public DbContext GetDbContext()
    {
        return _dbContext ?? (_dbContext = new SharweEntities());
    }

    public System.Data.Objects.ObjectContext GetObjectContext()
    {
        return _dbContext.ObjectContext;
    }

    public void Dispose()
    {
        if (_dbContext != null)
            _dbContext.Dispose();
    }
}

Есть мысли по этому поводу? Заранее спасибо.

1 Ответ

1 голос
/ 23 марта 2011

Я думаю, что из-за ошибки в вашей базе данных нет записи ItemStatus с Id = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...