【发布时间】:2015-10-18 21:04:06
【问题描述】:
我首先使用实体框架代码,最近创建了一个名为 ImportCases 的新 Repo 模型/表。
我已经像其他人一样设置了配置和模型,但是当我在我的代码中到达这一行时:
public int CreateImportantCase(ImportantCase newImportantCase)
{
_context.ImportantCases.Add(newImportantCase);
_context.SaveChanges(); // <--- here
return newImportantCase.ImportantId;
}
我收到此错误:
无法将值 NULL 插入“ImportantId”列,表 'MyDatabase.dbo.ImportantCases';列不允许空值。插入 失败。声明已终止。
我的模型/配置如下所示:
型号
public class ImportantCase
{
public int ImportantId { get; set; }
public int EvpId { get; set; }
public string Comment { get; set; }
public int CategoryId { get; set;}
}
EF 配置
class ImportantCaseConfiguration : EntityTypeConfiguration<ImportantCase>
{
public ImportantCaseConfiguration()
{
HasKey(x => x.ImportantId);
}
}
在调用 create 方法之前,我正在使用视图模型和模型绑定通过视图中的 Post 方法设置新的 ImportantCase:
if (imp != null ) // already a record, so update
{
imp.Comment = modifiedExceptionPersonViewModel.Comment;
imp.CategoryId = int.Parse(modifiedExceptionPersonViewModel.SelectedCategory);
_service.UpdateImportantCase(imp);
}
if (imp == null) //no record so create
{
ImportantCase newImportantCase = new ImportantCase();
newImportantCase.Comment = modifiedExceptionPersonViewModel.Comment;
newImportantCase.CategoryId = int.Parse(modifiedExceptionPersonViewModel.SelectedCategory);
newImportantCase.EvpId = modifiedExceptionPersonViewModel.EvpId;
_service.CreateImportantCase(newImportantCase);
}
我在SaveChanges 之前检查了newImportantCase 对象,它看起来和我预期的一样,将ImportantId 设置为'0',通常EF 只会在写入完成后创建ID。
我注意到的一件事是,当我查看该表的设计时,身份规范设置为No,EF 创建的所有其他表都设置为Yes,我做了什么不同的事情?
注意
EvpId 是从视图返回的视图模型的 ID,我刚刚将类别和注释属性滚动到此视图模型中,以便在控制器中单独处理它们。
编辑
我刚刚意识到,当我最初运行 update-database 时,我愚蠢地将 ImportantId 设置为一个字符串,但后来添加了一个新的迁移来纠正这个问题,没有意识到 EF 没有回顾性地整理身份规范,是有办法解决吗?
【问题讨论】:
-
要设置身份规范,您可以这样做
[Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ImportantId { get; set; } -
@Eldho 现在我已将 ImportId 正确设置为 int,如果我删除该表并再次运行 update-database 会发生什么,会对其进行排序吗?
-
我认为您可以按照上述评论中的说明更新您的
ImportantCase模型并尝试更新数据库,否则您可以删除表并再次运行
标签: c# entity-framework