实体框架问题 - ASP.NET 4 MVC 3 - SportsStore项目

时间:2011-09-13 17:19:32

标签: c# visual-studio-2010 asp.net-mvc-3 entity-framework-4

(Apress PRO:ASP.NET MVC 3框架 - 由Adam Freeman和Steven Sanderson撰写 - 第三版)

作为单挑:我是ASP.NET新手并在Visual Studio中构建多项目解决方案。)

我一直非常关注本书到第298页。(我正在使用SQL Express。)当我尝试在Visual Studio 2010(SP1)中编译和运行我的解决方案时,我遇到了麻烦。

当我将ADO.NET实体数据模型(.edmx文件)添加到Concrete / ORM /文件夹下的SportsStore.Domain项目时出现问题(这很奇怪......第291页上的书让它听起来像那样文件应该已经存在...)

...我在实体设计器中更新/刷新模型以包含两个新属性(ImageData和ImageMimeType) - >编译器在:

下抛出异常
using SportsStore.Domain.Abstract;
using SportsStore.WebUI.Models;
using SportsStore.Domain.Entities;

namespace SportsStore.WebUI.Controllers {
    public class ProductController : Controller {

        public ViewResult List(string category, int page = 1) {
            ProductsListViewModel viewModel = new ProductsListViewModel {
                Products = repository.Products
                    .Where(p => category == null || p.Category == category)
                    .OrderBy(p => p.ProductID)
                    .Skip((page - 1) * PageSize)
                    .Take(PageSize),
                PagingInfo = new PagingInfo { 
                     CurrentPage = page,
                     ItemsPerPage = PageSize,
                     TotalItems = category == null ?
                         repository.Products.Count() :
                         repository.Products.Where(e => e.Category == category).Count()
                },
                CurrentCategory = category
            };

            return View(viewModel);
        }
    }
}

说“无法找到SportsStore.Domain.Concrete.ORM.Product的概念模型类型。

当我删除.edmx文件时,解决方案成功编译 - >但当然,我无法使用新的图像属性将图片添加到数据库中。页面291说明了原因:产品表和产品类中的新列之间没有连接。 (我可以在网页上找到并选择一个图像(在磁盘上)并点击提交,但之后没有任何内容添加到数据库中。)

我不确定从哪里开始。如果它有助于显示我的项目更多我肯定会。 (这与书的完全相同。)

(实际上,SportsStore.Domain.Entities下的 Product 类还有另一个障碍。来自SportsStore下的 AdminController 的“ActionResult Edit(...)”方法。 WebUI.Controllers不喜欢将Product的ImageData属性声明为 byte 而不是 byte [] 。我当然修正了。我应该在本书的勘误表中报告吗?)< / p>

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这就是我修复它的方法。

  1. 不要添加edmx文件
  2. 更新EFProductRepository.cs中的SaveProduct方法
  3. 这样的事情:

    public void SaveProduct(Product product)
        {
            if (product.ProductID == 0)
            {
                context.Products.Add(product);
            }
            else
            {
                Product prod = context.Products.Where(p => p.ProductID == product.ProductID).FirstOrDefault();
                prod.Category = product.Category;
                prod.Description = product.Description;
                prod.ImageData = product.ImageData;
                prod.ImageMimeType = product.ImageMimeType;
                prod.Name = product.Name;
                prod.Price = product.Price;
            }
            context.SaveChanges();
        }
    

    我认为这不是最好的方法,因为我们手工制作地图。

    编辑:更好的方法

    public void SaveProduct(Product product)
        {
            if (product.ProductID == 0)
            {
                context.Products.Add(product);
            }
            else
            {
                context.Entry(product).State = EntityState.Modified;
            }
            context.SaveChanges();
        }
    

答案 1 :(得分:1)

我遇到了同样的问题,完全摆脱了.edmx文件。没有它,图像似乎在保存并显示正常。只需确保您的数据库,控制器和视图与本书中的内容一致。