2016-06-06 4 views
1

В моей модели SessionView. Я пытаюсь назначить данные из базы данных в локальную переменную, а затем присваивать эти данные соответствующим общедоступным свойствам (а не выполнять ее в контроллер).Как определить использование той же модели в модели

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

public class SessionView : BaseViewModel 
{ 
    public int SessionId { get; set; } 

    private SessionView data 
    { 
     get 
     { 
      return (from s in db.Sessions 
        where s.SessionId == SessionId 
        select new SessionView 
        { 
         CourseId = s.CourseId 
         // ... lots of other properties 
        }).FirstOrDefault(); 
     } 
     set { } 
    } 

    public int CourseId { get { return data.CourseId; } set { } } 
    // ... lots of other properties 
} 

Есть ли какой-нибудь умный способ добиться этого без ошибок?

Спасибо.

+0

является ли это ASP.NET или приложение для Windows? –

+2

Какая ошибка вы получаете? – wilsjd

+0

Если вы используете EF, вы можете позволить EF справиться с этим, используя ленивую загрузку. –

ответ

1

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

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

public class SessionView : BaseViewModel 
{ 
    private SessionView _sessionView; 
    public int SessionId { get; set; } 

    public SessionView() 
    { 
     _sessionView = new SessionView(); 
     _sessionView.data = from s in db.Sessions 
        where s.SessionId == SessionId 
        select new SessionView 
        { 
         CourseId = s.CourseId 
         // ... lots of other properties 
        }).FirstOrDefault(); 
    } 
    private SessionView data 
    { 
     get 
     { 
      return _sessionView.data 
     } 
     set { } 
    } 

    public int CourseId { get { return data.CourseId; } set { } } 
    // ... lots of other properties 
} 
+0

Благодарим вас за ответ. Я изначально извлекал данные из контроллера, но после прочтения того, как модели должны быть «жирными» и «худшими» контроллерами, я думал, что это будет хорошая идея. Кроме того, вместо того, чтобы заполнить модель представления, чтобы в этой части кода содержался один и тот же linq, он был бы централизован только здесь. – spaceduk

+0

Я думаю, что проблема связана с невозможностью присвоить значение SessionId перед обработкой linq.Я использовал 'SessionView sessionView = новый SessionView {SessionId = 5};' но SessionId в классе равен 0. – spaceduk

+0

@spaceduk не для меня, а затем haha ​​ – Sherlock

1

Я думаю, ваша проблема в том, что данные, нагрузка на вашей модели на самом деле происходит с точки зрения, что является плохой практикой в ​​MVC, вместо этого вы должны делать это на контроллере, с помощью службы, что-то как:

public class SessionController : Controller 
{ 
    private readonly ISessionsService sessionService; 

    public SessionController(ISessionsService sessionsService) 
    { 
     this.sessionService = sessionService; 
    } 

    public ActionResult SessionData(int sessionId) 
    { 
     var sessionData = sessionService.GetById(sessionId); 

     /// do whatever validation you might require here 

     var model = new SessionView(sessionData); // you could even pass the sessionId if required here 

     return View(model); 
    } 
} 

вы можете получить сервис Dependency-введенный в контроллер. Я думаю, что это предпочтительный способ сделать это на MVC

1

Где вы узнали, что контроллеры должны быть тонкими против толстых моделей? Бизнес-логика невелика в контроллерах, потому что было бы сложнее повторно использовать, чем в уровне бизнес-логики, но не путайте это с помощью только доступа к базе данных; это определенно должно держаться подальше от моделей, если вы можете помочь.

Этот вид работы, присваивающий вашей базе данных значение базы данных - это именно то, для чего предназначен контроллер в MVC. Я бы выбрал что-то вроде этого.

Модель

public class SessionView : BaseViewModel 
{ 
    public int SessionId { get; set; } 
    public int CourseId { get; set; } 
    // ... lots of other properties 
} 

Контроллер

public class HomeController : Controller 
{ 
    public ActionResult Index(){ 
     var context = new MyContext(); 
     var firstSession = context.Sessions.First(); 
     var viewModel = new SessionView 
     { 
      SessionId = firstSession.SessionId, 
      CourseId = firstSession.CourseId, 
      //keep populating here if you need 
     }; 
     return View(viewModel); 
    } 
} 
+0

Спасибо за ответ, я думаю, что я начинаю понимать, что сейчас , Я получил его для работы, выполнив поиск базы данных всех свойств в 'set'' SessionId'. Преимущество этого заключается в том, что он удерживает население «SessionView» в одном месте, но он кажется немного загроможденным, и, поскольку @Luiso говорит, что свойства получают только при необходимости, поэтому это может быть в представлении. – spaceduk

+0

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

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