2015-02-23 2 views
-3

У меня есть контекст тест настроить так:Null возвращается для отложенной загрузки

class TestAppContext : ContextInterface 
    { 

     public DbSet<Person> Persons {get; set;} 
     public DbSet<House> Houses { get; set; } 

     public TestAppContext() 
     { 
      this.Persons = new TestPersonDbSet(); 
      this.Houses = new TestHousesDbSet(); 
     } 

     public int SaveChanges(){ 
      return 0; 
     } 
     public void MarkAsModified(Object item) { 

     } 

     public void Dispose() { } 

    } 

модели выглядеть следующим образом:

class Person{ 
    [Key] 
    public int id {get; set;} 
    public string name {get; set;} 
} 

class House{ 
    [Key] 
    public int id {get; set;} 
    public string address {get; set;} 
    public int personId {get; set;} 
    [ForeignKey("personId")] 
    public virtual Person person {get; set;} 
} 

Теперь, если я запускаю этот тест блока:

[TestMethod] 
     public void GetServiceRequest_User() 
     { 
      TestAppContext context = new TestAppContext(); 
      House house = new House() {id=1, address="Middle of Nowhere", personId=3}; 
      Perosn person = new Person() {id=3, name="Some Dude"}; 
      context.Houses.Add(house); 
      context.Persons.Add(person); 

      HousesController controller = new HousesController(context); 
      var resultRaw = controller.GetHouse(house.id); 
      Assert.IsInstanceOfType(resultRaw, typeof(OkNegotiatedContentResult<House>)); 

      OkNegotiatedContentResult<House> result = resultRaw as OkNegotiatedContentResult<House>; 
      Assert.IsNotNull(result); 
      Assert.IsNotNull(result.Content.person); 
      Assert.AreEqual(result.Content.person.id, result.Content.personId); 
      Assert.AreEqual(result.Content.person.id, person.id); 
     } 

Не удается, из-за того, что result.Content.person имеет значение null. Почему это? Человек, как я понимаю, должен лениво загружаться, так как идентификаторы совпадают, но это, похоже, не так.

Как Запрошенный метод GetHouse:

[Route("{id:int}", Name="DisplayHouse")] 
     [ResponseType(typeof(House))] 
     public IHttpActionResult GetHouse(int id) 
     { 
      House house = db.Houses.Find(id); 
      if (house == null) 
      { 
       return NotFound(); 
      } 

      return Ok(house); 
     } 
+0

показать нам HouseController –

+0

@RobertLevy добавил метод получения выше. Контроллер является базовым контроллером. – steventnorris

+1

это не имеет ничего общего с ленивой загрузкой; прямо сейчас нет никакого вызова 'SaveChanges()', поэтому вызов класса с другим контекстом для получения того, что был добавлен в первом контексте, никогда не найдет ничего, потому что в базу данных ничего не было добавлено. – Claies

ответ

1

вы можете попробовать это, в том, что вы устанавливаете Id, как ключ я не думаю, что вы должны быть настройки значения, добавив человека к дому должен проволоки отношения. Поскольку вы не сохраняете контекст, ленивая загрузка не применяется. для этого вы хотите сохранить изменения в контексте.

[TestMethod] 
    public void GetServiceRequest_User() 
    { 
     TestAppContext context = new TestAppContext(); 
     House house = new House() {address="Middle of Nowhere"}; 
     Perosn person = new Person() {name="Some Dude"}; 
     house.person = person; 
     context.Houses.Add(house); 


     HousesController controller = new HousesController(context); 
     var resultRaw = controller.GetHouse(house.id); 
     Assert.IsInstanceOfType(resultRaw, typeof(OkNegotiatedContentResult<House>)); 

     OkNegotiatedContentResult<House> result = resultRaw as OkNegotiatedContentResult<House>; 
     Assert.IsNotNull(result); 
     Assert.IsNotNull(result.Content.person); 
     Assert.AreEqual(result.Content.person.id, result.Content.personId); 
     Assert.AreEqual(result.Content.person.id, person.id); 
    } 
Смежные вопросы