2014-11-06 3 views
0

Я использую первую модель кода EF6 с ленивой загрузкой. У меня есть один обычный проект (ASP.NET MVC) и один с тестами для него. Я создаю в init (drop exsists before) обычную базу данных для тестирования (без насмешек). Я использую тот же инициализатор в обоих проектах (и для поиска проблемы я пытаюсь использовать тот же connectionString для создания контекста).Entity Framework 6-ленивая загрузка ожидать пустую коллекцию, но возвращает null (только в тесте)

Когда я использую свойство, ведьма - это коллекция (данные из другой таблицы) без элементов, только в обычном проекте ef send sql request (я использую SQL Server Profiler для проверки), в тестировании проекта это свойство всегда равно нулю. Если сбор не пуст, он работает правильно в обоих случаях.

Это простая версия моего кода (пожалуйста скажите, если вам нужно STH больше, я не имеют понятия, где находится ошибка): модели данных:

public class Story 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int Id { get; set; } 
    [Index("CommentClusteredIndex_StoryId", IsClustered = true)] 
    public int StoryId { get; set; } 
    public virtual Story Story { get; set; } 
} 

Web.config (проект), приложение .config (тесты):

<configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
<connectionStrings> 
    <add name="StoriesEntitiesTestContext" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=StoriesEntitiesTestDb;Integrated Security=true;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

это, как я использовал его - код exsist в нормальном проекте (это один без тестов):

public void Method(DbContext context) 
{ 
      DbSet<Story> _dbSet = context.Set<Story>(); 
      var a = dbSet.First().Comment; //when Comment doesn't have items a is null in testing project and empty collection in normal project 
} 

ответ

1

Если вы хотите получить пустые коллекции вместо нулей, вы должны добавить Constructor в свой Entity с коллекцией и в конструкторе инициализировать пустую коллекцию.

public class Story 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 

    public Story() 
    { 
     Comments = new List<Comment>(); 
    } 
} 

Нечто подобное.

+0

Спасибо, это работает отлично :) Но вы можете объяснить мне, почему в основном проекте эф возвращает пустую коллекцию без конструктора? – user3232354

0

Вам нужно создать экземпляр коллекции в конструкторе:

public class Story 
{ 
    public Story() 
    { 
     Comments = new Collection<Comments>(); 
    } 
    public int Id { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
} 
+0

Спасибо, как и выше, это хорошее решение. Но у меня такой же вопрос, знаете ли вы, почему без конструктора EF возвращать пустую коллекцию в основной проект? – user3232354

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