2016-02-15 13 views
0

Я сидит с моим окончательным проектом в школе, но имею некоторые проблемы с его завершением.Добавление информации с использованием DbContext - ASP.NET MVC

Прежде всего, я создал веб-магазин с помощью следующих tutorial. Это учебник, основанный на MVC 3, но я сделал его для новой версии.

Впоследствии я хотел создать какую-то базу данных для блога, основанную на тех же принципах, и именно здесь у меня проблемы.

Я сделал статью в качестве модели:

public class Article 
{ 
    [Key] 
    public int ArticleId { get; set; } 
    public int SubjectId { get; set; } 
    public string Title { get; set; } 
    public string MainText { get; set; } 
    public string PictureURL { get; set; } 
    public ArticleSubject ArticleSubject { get; set; } 
} 

Затем я создал ArticleSubject:

public class ArticleSubject 
    { 
     [Key] 
     public int SubjectId { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public List<Article> Articles { get; set; } 
    } 

Затем я создал NewsEntities DbContext:

public class NewsEntities : DbContext 
{ 
    public DbSet<Article> Articles { get; set; } 
    public DbSet<ArticleSubject> ArticleSubjects { get; set; } 
} 

Наконец я наполненную следуя за классом «NewsData»:

public class NewsData : DropCreateDatabaseIfModelChanges<NewsEntities> 
{ 
    protected override void Seed(NewsEntities context) 
    { 
     var articleSubjects = new List<ArticleSubject> 
     { 
      new ArticleSubject { Title = "Almindelige Nyheder" }, 
      new ArticleSubject { Title = "Arrangementer" }, 
      new ArticleSubject { Title = "Udstillinger" } 
     }; 
    } 
} 

Затем я создал NewsManagerController, используя Entity Framework. Когда я запускаю свое приложение и создаю новые статьи, выпадающее поле Subject пусто. Я всю ночь искал решение без везения.

Надеюсь, вы можете мне помочь! Не стесняйтесь запрашивать дополнительные фрагменты кода или информацию.

Спасибо!

// refnedergaard

EDIT:

Контроллер:

public class NewsManagerController : Controller 
{ 
    private NewsEntities db = new NewsEntities(); 

    // GET: NewsManager 
    public ActionResult Index() 
    { 
     var articles = db.Articles.Include(a => a.ArticleSubject); 
     return View(articles.ToList()); 
    } 

    // GET: NewsManager/Details/5 
    public ActionResult Details(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Article article = db.Articles.Find(id); 
     if (article == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(article); 
    } 

    // GET: NewsManager/Create 
    public ActionResult Create() 
    { 
     ViewBag.SubjectId = new SelectList(db.ArticleSubjects, "SubjectId", "Title"); 
     return View(); 
    } 

    // POST: NewsManager/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "ArticleId,SubjectId,Title,MainText,PictureURL")] Article article) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Articles.Add(article); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.SubjectId = new SelectList(db.ArticleSubjects, "SubjectId", "Title", article.SubjectId); 
     return View(article); 
    } 

    // GET: NewsManager/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Article article = db.Articles.Find(id); 
     if (article == null) 
     { 
      return HttpNotFound(); 
     } 
     ViewBag.SubjectId = new SelectList(db.ArticleSubjects, "SubjectId", "Title", article.SubjectId); 
     return View(article); 
    } 

    // POST: NewsManager/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "ArticleId,SubjectId,Title,MainText,PictureURL")] Article article) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(article).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.SubjectId = new SelectList(db.ArticleSubjects, "SubjectId", "Title", article.SubjectId); 
     return View(article); 
    } 

    // GET: NewsManager/Delete/5 
    public ActionResult Delete(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Article article = db.Articles.Find(id); 
     if (article == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(article); 
    } 

    // POST: NewsManager/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     Article article = db.Articles.Find(id); 
     db.Articles.Remove(article); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
} 

Создание вида:

@model boerglumklosterdk.Models.Article 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Article</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.SubjectId, "SubjectId", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownList("SubjectId", null, htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.SubjectId, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.MainText, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.MainText, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.MainText, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.PictureURL, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.PictureURL, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.PictureURL, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 
+1

показать нам соответствующий метод действия и просмотр кода для формы создания – Shyju

+0

Что _Subject-dropdown_ вас необходимо показать соответствующий код (контроллер и представление) –

+0

Я добавил контроллер и создаю представление к сообщению. Спасибо за вашу помощь, оцените! – refnedergaard

ответ

0

Я думаю, ваш вопрос, потому что вы не экономить на вашу БД вашего списка ArticleSubject. Вам нужно добавить их сначала ArticleSubjects DbSet и их называют SaveChanges метод вашего контекста:

context.ArticleSubjects.AddRange(articleSubjects); 
context.SaveChanges(); 

Теперь, если вы используете Migration, вы не собираетесь отказаться от вашего DB в случае, если ваши изменения модели, так что вы могли бы хотите использовать вариант @Sam, чтобы избежать дублирования.

Кроме того, для того, чтобы выполнить свой собственный инициализатор, вы должны установить DB Initializer через Database собственности:

public class NewsEntities : DbContext 
{ 
    public DbSet<Article> Articles { get; set; } 
    public DbSet<ArticleSubject> ArticleSubjects { get; set; } 

    public NewsEntities() 
    { 
     Database.SetInitializer(new NewsData()); 
    } 
} 
+0

Ну, я попробовал «@sam way» и добавил ваши общедоступные скобки для новостей NewsEntities(). Я ничего не понял. Когда я попытался с точкой останова и поэтапно, он почему-то не показывал med NewsData.cs. – refnedergaard

+0

СЕЙЧАС! Я использовал контекст .ArticleSubjects.AddRange (articleSubjects); context.SaveChanges() Итак, вы были правы только потому, что я не сохранил данные. Спасибо за вашу помощь, оцените! – refnedergaard

1

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

public class NewsData : DropCreateDatabaseIfModelChanges<NewsEntities> 
{ 
    protected override void Seed(NewsEntities context) 
    { 
     context.ArticleSubjects.AddOrUpdate(
      p => p.Title, 
      new ArticleSubject { Title = "Almindelige Nyheder" }, 
      new ArticleSubject { Title = "Arrangementer" }, 
      new ArticleSubject { Title = "Udstillinger" } 
     ); 
    } 
}