2016-07-29 6 views
0

СценарийEf6 Игнорирование соответствующие данные

public class Product : Entity, IAggregateRoot 
{ 
    public string Name { get; set; } 
    public string Dimension { get; set; } 
    public decimal Volume { get; set; } 
    public bool Featured { get; set; } 
    public Farm Farm { get; set; } 
    public int FarmId { get; set; } 
    /// <summary> 
    /// Sell Price 
    /// </summary> 
    public decimal BidPrice { get; set; } 
    public int QuantityAvaliable { get; set; } 
    public ICollection<Image> Images { get; set; } 
    public string Description { get; set; } 
    public Category Category { get; set; } 
    public int CategoryId { get; set; } 
    public DateTime Created { get; set; } 
    public DateTime? Modified { get; set; } 
} 

public class Category : Entity, IAggregateRoot 
{ 
    public string Title { get; set; } 
    public string CategoryImage { get; set; } 
    public Category Parent { get; set; } 
    public DateTime Created { get; set; } 
    public DateTime? Modified { get; set; } 
} 

установка Отношения

public class ProductMap : EntityTypeConfiguration<Product> 
{ 
    public ProductMap() 
    { 
     HasKey(x => x.Id); 

     Property(x => x.Created).HasColumnType("DateTime"); 
     Property(x => x.Modified).HasColumnType("DateTime"); 
     Property(x => x.BidPrice).HasColumnType("Decimal"); 

     #region RELATIONSHIP 
     //BelongsTo 
     HasRequired(x => x.Farm); 
     HasRequired(x => x.Category); 

     HasMany(x => x.Images); 

     #endregion 
    } 

Так что у меня это две модели, где мне нужно, чтобы привести данные модели продукта с информацией Категория

Я проверил моя база данных, данные согласованы, в записи продукта есть FK для записи в категории.

но когда я пытаюсь получить данные о продукте с помощью EF6, информация о категории не приходит, я получаю нулевой объект.

Because of =() => 
    { 
     _product = _repository.Find(p => p.Id == 1, p => p.Category); 
    }; 

    It should_not_be_bull =() => 
     _product.Category.ShouldNotBeNull(); 

Ответ от базы данных для категории является нулевым. но запись есть.

У меня было это нормально. по какой-то случайной магической причине он просто перестает работать.

метод FIND

public virtual TEntity Find(Expression<Func<TEntity, bool>> predicate = null, params Expression<Func<TEntity, object>>[] includes) 
    { 
     var set = CreateIncludedSet(includes); 

     return (predicate == null) ? 
       set.FirstOrDefault() : 
       set.FirstOrDefault(predicate); 
    } 

CreateIncludeSet

private IDbSet<TEntity> CreateIncludedSet(IEnumerable<Expression<Func<TEntity, object>>> includes) 
    { 
     var set = CreateSet(); 

     if (includes != null) 
     { 
      foreach (var include in includes) 
      { 
       set.Include(include); 
      } 
     } 

     return set; 
    } 

метод CreateSet

private IDbSet<TEntity> CreateSet() 
    { 
     return Context.CreateSet<TEntity>(); 
    } 

МОЯ реализация DbContext здесь

https://github.com/RobsonKarls/FreedomWebApi/blob/dev/Source/Freedom.Infrastructure.DataAccess/Factories/FreedomDbContext.cs

всего проект находится там для дальнейших анализов

любой помощь ценна.

Спасибо

+0

[код] публичный виртуальный TEntity Find (Expression > предикат = NULL, Params Expression > [] включает в себя) [/code] Метод принимает 2 параметра, сначала для Where() и Second one для Include – RobsionKarls

ответ

0

Проблема в вашем коде в этой строке в CreateIncludedSet метод:

set.Include(include); 

Да, вы включаете данные, но вы не меняете вас. Вы должны изменить его на что-то вроде:

set = set.Include(include); 
+0

set variable - тип IDbSet и set.Include() возвращает IQueryable , Я попытался сделать это 'set.Expression = set.Include (include)', но Expression не имеет setter. но я получил вашу точку зрения и полностью согласен с этим. – RobsionKarls

+1

я получил ваше понимание и может решить эту проблему, я изменил метод: 'частное IQueryable CreateIncludedSet (IEnumerable >> включает в себя) { IQueryable комплект = CreateSet(); if (includes! = Null) { foreach (входит в комплект включает) { set = set.Include (include); } } return set; } ' Перед тем, как использовать IDbSet, и теперь он возвращает Iqueryable , таким образом я мог бы сделать то, что вы сказали мне раньше. – RobsionKarls

0

Ваш код немного неясно, но попробовать что-то вроде этого ....

_product = _repository.Include(p => p.Category).SingleOrDefault(x => x.Id == 1); 

также см ... https://stackoverflow.com/a/7348694/6200410

+0

точно, p.Category является параметром для Include() – RobsionKarls

Смежные вопросы