Я потратил некоторое время на построение моей доменной модели (сначала с использованием 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();
}
}
Есть мысли по этому поводу? Заранее спасибо.