基于没有键定义mvc5的类

时间:2014-05-28 10:57:36

标签: c# asp.net-mvc asp.net-mvc-5

我尝试从此控制器添加视图。我只需要这个视图来显示不是插入或更新或删除的数据

public ActionResult Index()
{
    var CartObj = ShoppingCart.GetCart(this.HttpContext);

    var classshop = new New
    {
        CartItems = CartObj.GetCartItems(),
        CartTotal = CartObj.GetSum()
    };

    return View(classshop);
}

namespace MusicStore.Models
{
    public class ShoppingCart
    {
        MusicStoreEntities dbo = new MusicStoreEntities();
        string ShoppingCartID { get; set; }

        public const string CartSessionKey = "CartId";
        public static ShoppingCart GetCart(HttpContextBase Context)
        {
            var cart = new ShoppingCart();
            cart.ShoppingCartID = cart.GetCardId(Context);
            return cart;
        }
        public static ShoppingCart GetCart(Controller controller)
        {
            return GetCart(controller.HttpContext);
        }

        public  List<Cart> GetCartItems()
        {
            return dbo.Carts.Where(a => a.CartId == ShoppingCartID).ToList();
        }

        public decimal? GetSum()
        {
            decimal? Sum = (from items in dbo.Carts
                         where items.CartId == ShoppingCartID
                         select (int)items.Count * items.album.Price).Sum();
            return Sum ?? decimal.Zero;
        }
    }
}

然后我收到了这个错误:

  

运行所选代码生成器时出错:   '无法检索'Musicstore.Model.new'的元数据   在模型生成期间检测到一个或多个验证错误   musicstore,models.New:实体类型'New'没有定义键。   定义entityType的键

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MusicStore.Models
{
    public class New
    {
        public List<Cart> CartItems { get; set; }
        public decimal? CartTotal { get; set; }

    }
}

2 个答案:

答案 0 :(得分:2)

这里有两种选择。首先,如果此类映射到数据库中的表,则实体框架中的每个模型都需要一个主键。将其添加到您的模型中:

[Key]
public int Id { get; set; }

这将创建一个名为Id的新属性,[Key]属性使其成为主键。从技术上讲,您不需要该属性,因为EF将获取Id属性并将其用作密钥,但我更喜欢明确。

或者,如果您不希望此类成为数据库中的表,请将NotMapped属性添加到类中,如下所示:

[NotMapped]
public class New
{
    public List<Cart> CartItems { get; set; }
    public decimal? CartTotal { get; set; }

}

答案 1 :(得分:0)

我知道这已经过时了,但我刚遇到这个问题。

当我在Models文件夹Visual Studio&#34; smartly&#34;中创建一个类CreateEmployeeViewModel时,会发生什么?在我的数据库上下文类中添加一行

public System.Data.Entity.DbSet<eManager.Web.Models.CreateEmployeeViewModel>
       CreateEmployeeViewModels { get; set; }

因此,在下一个update-migration上创建了一个表格。删除此行删除了对关键字段的要求。

注意:如果创建了表,您可能还需要将行AutomaticMigrationDataLossAllowed = true;添加到DBMigrationConfiguration类。