Проблема с Entity Framework / отношениями БД - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть класс Артикул:

    public class Article
{
    public int Id { get; set; }
    public string Text { get; set; }
    public Title Title { get; set; }

}

и название:

    public class Title
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int MaxChar { get; set; }   
}

Прежде чем вы сможете написать Article, вы должны выбрать свой Title из списка, чтобы можно было определить ваш StringLength для Article.Text. Это означает, что эта статья может иметь только определенное количество символов, в зависимости от того, какой «Заголовок» имеет автор. Пример: Title.Name «Title1» может написать статью только с 1000 символов (MaxChar), а Title.Name «Title2» может написать статью с 3000 символов. Так. Это означает, что длина строки для Article.Text должна быть от Title.MaxChar.

Сущность Title - это префиксные данные, которые будут храниться в БД.

Вот что я сделал далеко: Заголовки из БД перечислены в виде со ссылкой для создания действия ArticleController с строкой запроса «title»:

    @Models.Title

@foreach (var item in Model) {
         @Html.ActionLink(item.Name, "Create", "Article", new { title = item.Id}, new FormMethod())

        }

Вы заполняете форму и публикуете ее. Действие HttpPost Create:

    [HttpPost]
    public ActionResult Create(Article article)
    {
        if (article.Text.Length > article.Title.MaxChar)
        {
            ModelState.AddModelError("Text",
                                     string.Format("The text must be less than {0} chars bla bla", article.Title.MaxChar));
        }
        if (ModelState.IsValid)
            {
                db.Article.Add(article);
                db.SaveChanges();
                return RedirectToAction("Index");
            }


        return View(hb);
    }

Вот проблема. Контроллер также добавляет новый объект Title. Поэтому в следующий раз, когда я перейду к представлению, в котором мне нужно будет выбрать Заголовок, появится копия последней сущности, которую я использовал для написания статьи.

Должен ли я сделать это совершенно новым способом, или есть небольшой твик? Единственное, о чем я могу думать, это просто отправить MaxChar в виде строки запроса и вообще не иметь отношения между моделями. Просто кажется немного глупо / webforms kindda.

Приветствия

ОБНОВЛЕНИЕ № 1: Может быть, я делаю это неправильно? Действие Создать

        public ActionResult Create(int title)
    {
        var model = new Article
        {
            Title = db.Title.Find(title)
        };
        return View(model);
    } 

Или, может быть, это в модели? Мол, я должен установить внешние ключи? Что-то вроде:

        [ForeignKey("Title")]
    public int MaxChar { get; set; }
    public virtual Title Title { get; set; }

Но я уверен, что я читал кое-что, где это не нужно, что EF позаботится об этом.

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Самый простой способ - прикрепить заголовок к контексту в вашем действии Create:

// ...
if (ModelState.IsValid)
{
    db.Titles.Attach(article.Title);
    db.Article.Add(article);
    db.SaveChanges();
    return RedirectToAction("Index");
}
// ...

Attach сообщает EF, что article.Title уже существует в базе данных, что позволяет избежать добавления нового Title при добавлении статьи в контекст.

1 голос
/ 14 сентября 2011

Вам необходимо различать модель MVC и модель сущностей.Ваша модель статьи MVC должна выглядеть примерно так (имейте в виду, что существуют религиозные дебаты о том, что входит в модель):

public class Article
{
    public int Id { get; set; }
    public string Text { get; set; }
    public int TitleID { get; set; }
    public IEnumerable<Title> AvailableTitles {get;set;}
}

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

Когда ваш метод, связанный с моделью, возвращает TitleID, создайте экземпляр объекта Title из среды Entities.от удостоверения личности.Создайте свой объект Entities Article, используя этот объект Title, и сохраните изменения.Это должно привести вас туда, где вы хотите быть.

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