Ассоциации в ASP.Net MVC2 - PullRequest
       1

Ассоциации в ASP.Net MVC2

0 голосов
/ 25 февраля 2012

Я использую LINQ в качестве ORM в проекте веб-приложения, использующем VS2010. Я определил ER в базе данных SQL и просто перетащил таблицы базы данных в ORM. Таблица переноса имеет 4 взаимосвязи с таблицей больниц с 4 различными столбцами. Один из столбцов - FK, int, а не null. Остальные три FK, int, null. В DBML класс Transfer имеет 4 ассоциации с классом Hospital. Ассоциация с требуемым Transfer.Hospital (FK, int, not null) имеет следующие свойства.

Cardinality: OneToMany
Child Property: True
  Access: Public
  Inheritance Modifier: (None)
  Name = Transfers1
Parent Property
  Access: Public
  Inheritance Modifier: (None)
  Name: HospitalSrcOrDest
Participating Properties: Hospital.HospitalID -> Transfer.Hospital
Unique: False

Модель просмотра, используемая на странице просмотра, имеет свойство Transfer типа Transfer. Model.Transfer.Hospital всегда имеет целочисленное значение. Однако Model.Transfer.HospitalSrcOrDest в следующем скрипте страницы всегда имеет значение null. Разве HospitalName не должен быть автоматически получен через ассоциацию Hospital_Transfer1? Спасибо.

<%: Model.Transfer.HospitalSrcOrDest != null ?   Model.Transfer.HospitalSrcOrDest.HospitalName : string.Empty%>

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Я изменил свой конструктор хранилища, но это не имеет никакого значения.

public AppRepository() //constructor
{
        // Create DataLoadOptions
        DataLoadOptions dlo = new DataLoadOptions();

        // Always fetch source or destiation hospital when we get transfer
        dlo.LoadWith<Transfer>(t => t.HospitalSrcOrDest);

        // Set these options on the DataContext
        db.LoadOptions = dlo;
....

}

Насколько я понимаю, LINQ использует Eager Loading по умолчанию (http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/06/linq-to-sql-deferred-loading-lazy-load.aspx). * В моей модели представления передача передается контроллером. Должен ли я добавить свойство HospitalSrcOrDest в модель представления и загрузить значение с помощью навигации Ассоциация.

public ActionResult Edit(string id)
{
....

Transfer transfer = base.ApplicationRepository.GetTransfer(intID);

if (transfer == null)
  {
     ViewData["Message"] = "There is no transfer record";
     return View("NotFound");
  }

TransferViewModel vm = new TransferViewModel(base.ApplicationRepository, transfer, "Edit");

return View(vm);
}
0 голосов
/ 25 февраля 2012

Это может быть проблема с отложенной загрузкой. Вы передаете текстовый текст перед тем, как вид на больницу будет доступен? По умолчанию L2S загружает ленивые отношения. Это означает, что он не получает его из базы данных до тех пор, пока свойство не будет фактически доступно. Если ваше соединение прервалось к тому времени, когда представление обращается к больнице, возможно, оно не сможет получить его. Просто предположение.

Чтобы проверить это, в контроллере после выполнения загрузки / выбора немедленно попытайтесь получить доступ к больнице, чтобы заставить его загрузить.

Если вы хотите всегда искать больницу, вот ссылка, которая показывает вам, что делать: http://blog.dantup.com/2009/04/eager-fetching-of-relationships-with.html

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