MVC 4使用Repository Framework将模型数据插入数据库

时间:2013-12-30 15:15:56

标签: asp.net-mvc asp.net-mvc-4 entity-framework-4

这是我的ListView模型,它更多与我建立的名为Comment的数据库表相对应。

 public int EntryId { get; set; }
    public DateTime Posted { get; set; }
    public string AuthorIp { get; set; }

    [Required(ErrorMessage = " A Name is required *")]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    [StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length.")]
    public string AuthorName { get; set; }

    [Required(ErrorMessage = "Email address required *")]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    [StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length *")]
    [EmailValidation(ErrorMessage = "Must be valid email *")]
    public string AuthorEmail { get; set; }

    [Required(ErrorMessage = " A Message is required *")]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    [StringLength(4000, MinimumLength = 2, ErrorMessage = "Must be between 2 & 4000 characters in length *")]
    public string Body { get; set; }

    public ListView(IBlogRepository blogRepository)
    {
        Posts = blogRepository.Posts();
    }
    public ListView(){ }`

我需要将一些属性放入我的Comment表中。我使用或至少尝试使用IRepository Framework。就像这样......

 public interface IBlogRepository : IDisposable
{
    IList<Entry> Posts();

    void InsertComment(Comment comment);
    void Save();
}

这是我的继承课......

public class BlogRepository : IBlogRepository, IDisposable
{
    private BlogDataDataContext _dataContext;
    public BlogRepository() { _dataContext = new BlogDataDataContext(); }

   // #region IBlogRepository Members

    public void InsertComment(Comment comment)
    {
        _dataContext.Comments.InsertOnSubmit(comment);
    }

    public void Save()
    {
        _dataContext.SubmitChanges();
    }

所以我从我的BlogController上面调用了上面的InsertComment。

       [HttpPost]
        public ActionResult BlogPost(ListView pModel)
        {

            pModel.Posted = DateTime.Now;
            _repository.InsertComment( // Cannot pass pModel as is not Comment type.

            return RedirectToAction("BlogPost");
        }

所以我的问题是我的ListView pModel是传入但它不是Comment类型所以我不能正确插入它。我需要我的ListView模型,因为它包含额外的验证规则和几个构造函数。任何人都知道我哪里出错了。

我是否需要创建一个直接镜像我正在考虑的数据库表的模型。那么我在哪里移动我的构造函数和其他验证规则?感觉我需要两个型号。一个在另一个之上。我现在非常接近理解这一点。

提前致谢。

3 个答案:

答案 0 :(得分:0)

我认为您的方法整体看起来不错,但您需要某种方式来获取当前Comment对象以传递到您的存储库。无论是创建另一个对象来容纳两个对象,还是重构代码,我都建议您查看以下文章:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

答案 1 :(得分:0)

如果您使用ASP.NET MVC,您的模型应该是表格的精确“副本”。 如果您希望其他一些信息传递到您的视图,您可以使用viewmodels。

在你的例子中,你为什么不这样做:

 [HttpPost]
    public ActionResult BlogPost(ListView pModel)
    {

        pModel.Posted = DateTime.Now;

        foreach (Comment comment in ListView.Posts)
         {
            _repository.InsertComment(comment);
         }

        return RedirectToAction("BlogPost");
    }

答案 2 :(得分:0)

您可以使用AutoMapper将ViewModel中的属性映射到控制器中的评论业务模型:

var comment = Mapper.Map<ListView, Comment>(pModel);

_repository.InsertComment(comment);

使用ViewModels或DTO时,这是常见的做法。