2012-02-24 4 views
0

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

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%> 

ответ

0

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

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 использует жадную загрузку по умолчанию (http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/06/linq-to-sql-deferred-loading-lazy-load.aspx). В моей модели просмотра передача передается контроллером. Должен ли я добавить свойство HospitalSrcOrDest в View Model и загрузить значение, перемещая ассоциацию.

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

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

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

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

+0

Я установил loadoption в конструктор репозитория, как и предлагалось, но это не имеет никакого значения. // Создание DataLoadOptions DataLoadOptions dlo = new DataLoadOptions(); // Всегда извлекать теги, когда мы получаем сообщения dlo.LoadWith (p => p.Tags); // Установите эти параметры в DataContext db.LoadOptions = dlo; – user266909