Миграция с Модели Сначала на Код Во-первых, некоторые серьезные изменения - PullRequest
1 голос
/ 04 июля 2011

Этот код работал нормально, когда я впервые использовал модель.И перестал сохранять голосование, если это new Vote().Я предполагаю, что сначала сгенерированные классы модели использовали некоторую «магию» в установщиках свойств, которые, как я думал, это то, для чего мы поместили virtual в свойствах кода сначала.Есть ли способ заставить его работать по старому стилю?или я должен искать, заменять и связывать новый объект с графиком каким-то другим способом?

public ActionResult Vote(int id, string votetype)
{
    int userid = ViewBag.User.Id;
    var pub = DB.Publications.Single(p => p.Id == id);
    var votes = pub.Votes.SingleOrDefault(v => v.MemberId == userid) ??
                new Vote
                {
                     MemberId = userid,
                     Publication = pub
                 };
    DB.SaveChanges();
    return RedirectToAction("Full", new { id = id });
}

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

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

Магия заключается в автоматическом исправлении навигационных свойств.Вы создаете новый Vote и устанавливаете его Publication свойство навигации с экземпляром Publication, присоединенным к контексту.В этом случае EF установит для вас отношения, а также внутренне добавляет Vote к Publication.Из-за исправления новый Vote также будет отслеживаться (как новая сущность).

Ваши пользовательские классы, используемые в коде вначале, не имеют методов исправления, если вы не напишите их вручную или не скопируетеони из кода, сгенерированного шаблоном POCO T4, который сначала использовался в модели и базе данных.Без исправления новый Vote не будет добавлен в контекст, а SaveChanges не будет выполнять никаких изменений.

Используйте код @ Diego для исправления вашего метода.

3 голосов
/ 04 июля 2011

Нигде в этом коде вы не говорите EF о сохранении нового голосования.

Измените строку, в которой вы получаете / создаете голосование, на:

var vote = pub.Votes.SingleOrDefault(v => v.MemberId == userid);
if (vote == null)
    pub.Votes.Add(new Vote
                  {
                      MemberId = userid,
                      Publication = pub
                  });
...