为什么我不能使用Entity Framework Code First将新数据添加到我的数据库中?

时间:2017-06-13 15:09:13

标签: c# sql-server entity-framework sql-server-2012

我有史以来第一次在我的POCO课程中使用GUID作为PK值,这引起了一个相当恼人的问题,即我似乎无法将数据添加到我的表格中。

以下是一个例子:

public partial class EntityType
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public string Type { get; set; }

    public bool Deleted { get; set; }
}

这是我的迁移配置种子方法:

internal sealed class Configuration : DbMigrationsConfiguration<AC.WebGUI.Models.OrtundDataModel>
{
    protected override void Seed(AC.WebGUI.Models.OrtundDataModel context)
    {
        // Prepopulate Entity Types.
        if (!context.EntityTypes.Any())
        {
            context.EntityTypes.AddOrUpdate(
                new EntityType { Id = Guid.NewGuid(), Type = "Supplier" },
                new EntityType { Id = Guid.NewGuid(), Type = "Distributor" },
                new EntityType { Id = Guid.NewGuid(), Type = "Staff" },
                new EntityType { Id = Guid.NewGuid(), Type = "Customer" },
                new EntityType { Id = Guid.NewGuid(), Type = "Pharmacy" }
            );
            context.SaveChanges();
        }            
    }

请注意,在这两个课程中,我都为Guid.NewGuid()属性指定了Id值。

然而,这并没有让我解决这个错误:

  

System.Data.SqlClient.SqlException:无法将值NULL插入列&#39; Id&#39;,table&#39; Ortund.dbo.EntityTypes&#39 ;;列不允许空值。 INSERT失败。

显然,调用Guid.NewGuid()不能为空值,因此我不确定如何继续进行此操作。我想如果我将它添加到定义表的类的构造函数中,我可以从该类的实际实现中删除它,但是,无论我是从构造函数中还是从实现中删除它,错误仍然存​​在。

如何在没有任何错误的情况下将这些Guid添加到我的表数据中?我错过了什么?

编辑 - 解决重复问题

由于我的问题被标记为重复of this question,它处理使用指定的数据注释以使EF自动为表格上的PK列生成GUID值,我想我只是解释一下我的不同之处。

这个想法是相同的,真实的,但是实现与其他问题中讨论的内容不同,所以我为自己的项目找到了一个完全不同的解决方案,其中涉及删除此数据注释,而在另一个问题中提出的解决方案会保留它并对数据模型进行其他更改。

1 个答案:

答案 0 :(得分:0)

我想在关闭之前回答这个问题。

根据评论,只需从PK属性中删除DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释即可修复问题,但我确实在构造函数中保留了赋值。