ASP.NET MVC 5无法识别主键

时间:2016-12-24 12:03:25

标签: asp.net sql-server asp.net-mvc model-view-controller entity

我的代码优先模型的主键存在问题。

这是我的模型类的样子:

public class Expense
{
    public int ExpenseId { get; set; }
    public string Description { get; set; }
    public float Amount { get; set; }
}

当我尝试创建此类的实例时:

Expense MyExpense = new Expense();
MyExpense.Description = "Some Expenses";
MyExpense.Amount = 1234;

MyDbContext.Expenses.Add(MyExpense);
MyDbContext.SaveChanges();

我收到以下错误

  

无法将值NULL插入列' ExpenseId',table' aspnet-SomeDB-20161219050403.dbo.Expenses&#39 ;;列不允许空值。 INSERT失败。

以下是我的迁移文件的样子(我已从模型中删除了一些内容以保持简单)。

CreateTable("dbo.Expenses",
            c => new
                 {
                     ExpenseId = c.String(nullable: false, maxLength: 128),
                     Description = c.String(),
                     Amount = c.Single(nullable: false),
                     PaymetnDate = c.DateTime(nullable: false),
                     AddedById = c.String(maxLength: 128),
                  })
             .PrimaryKey(t => t.ExpenseId)
             .ForeignKey("dbo.AspNetUsers", t => t.AddedById)
             .Index(t => t.AddedById);

3 个答案:

答案 0 :(得分:0)

只需在Expense类上装饰ExpenseId字段,如下所示,SQL Server将自动生成插入值。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ExpenseId { get; set; }

答案 1 :(得分:0)

在表设计器中,您可以将id列设置为自动迭代 - 在属性窗口中

答案 2 :(得分:0)

问题是你的主键是一个字符串而EntityFramework不知道如何自动增加它!其他答案是正确的,但是,EntityFramework应该自动将ExpenseId设置为自动递增并作为主键。但是,它没有,因为仔细查看您的迁移代码:

CreateTable("dbo.Expenses",
            c => new
                 {
                     ExpenseId = c.String(nullable: false, maxLength: 128), //<------ ExpenseId is a string!!!
                     Description = c.String(),
                     Amount = c.Single(nullable: false),
                     PaymetnDate = c.DateTime(nullable: false),
                     AddedById = c.String(maxLength: 128),
                  })
             .PrimaryKey(t => t.ExpenseId)
             .ForeignKey("dbo.AspNetUsers", t => t.AddedById)
             .Index(t => t.AddedById);

另一点需要注意的是,PaymentDate拼错为PaymetnDate。在构建迁移后,您是否更改了ExpenseId的数据类型?如果您重新构建迁移或以其他方式修复代码,以便它插入一个int ExpensideId而不是字符串,那么您将会很高兴。这是应该的方式,因为这是你在模型中指定它的方式。

如果您确实希望ExpenseId成为字符串,那么您需要更新您的问题或评论,我可以相应地更新答案,但只知道实体框架不知道如何&#34;增加&# 34;一个字符串,因为它不一定是数字。