我的代码优先模型的主键存在问题。
这是我的模型类的样子:
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);
答案 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;一个字符串,因为它不一定是数字。