由数据库自动生成Guid

时间:2019-03-25 14:36:03

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

它与Entity Framework 6有关,但可能与版本无关。

我有一个具有Guid ID的类,但通过继承。

public partial class TestObject : SomeModel<Guid>
{

        public TestObject()
        {
        }

    .
    .
    .
        public virtual ICollection<TestObject1> TestObject1s { get; set; }

        public virtual ICollection<TestObject2> TestObject1s { get; set; }
}


    public abstract class SomeModel<TKey>
    {
        public TKey Id { get; set; }

    }

现在,我想更改此模型以通过数据库自动生成ID。 我通过添加

更改了TestObject类
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

public partial class TestObject : SomeModel<Guid>
{

        public TestObject()
        {
        }

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


    .
    .
    .
        public virtual ICollection<TestObject1> TestObject1s { get; set; }

        public virtual ICollection<TestObject2> TestObject1s { get; set; }
}

但是在执行命令add-migration test之后,我得到了空的实现

public partial class test : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}

这意味着什么都不会改变。 当然,在执行update-Database之后,它不会影响数据库。

但是如果我创建一个全新的类(其实现与TestObject相同)。它有效并且会影响数据库。

public partial class TestObjectNew : SomeModel<Guid>
{

        public TestObjectNew()
        {
        }

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

    .
    .
    .
        public virtual ICollection<TestObject1> TestObject1s { get; set; }

        public virtual ICollection<TestObject2> TestObject1s { get; set; }


}

有人可以解释这种行为吗?

如何更新我的班级以获取数据库的自动生成ID?

1 个答案:

答案 0 :(得分:0)

您是否从基类中删除了TKey Id? (基层现在甚至有目的吗?)

该属性也应标记为键:

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

然后,您可以在迁移中指定默认值。参见:Entity Framework 6 GUID as primary key: Cannot insert the value NULL into column 'Id', table 'FileStore'; column does not allow nulls