Entity framework 具有自动增量的自定义关键点

Entity framework 具有自动增量的自定义关键点,entity-framework,entity-framework-6,ef-code-first,ef-code-first-mapping,Entity Framework,Entity Framework 6,Ef Code First,Ef Code First Mapping,我有一个实体 entity.Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 因为某些原因,我需要手动输入一些id。 如果未提供id(等于0),是否可以自动添加下一个可用id(int) 它应该像标识字段一样工作,但在某些特殊情况下可以手动定义id 编辑: 在将数据从现有数据库迁移到新数据库时,是否可以手动定义ID,并将ID字段作为新数据库中的主键 经过一些讨论后,它建议我们每年只需要

我有一个实体

entity.Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
因为某些原因,我需要手动输入一些id。 如果未提供id(等于0),是否可以自动添加下一个可用id(int)

它应该像标识字段一样工作,但在某些特殊情况下可以手动定义id

编辑:

在将数据从现有数据库迁移到新数据库时,是否可以手动定义ID,并将ID字段作为新数据库中的主键

经过一些讨论后,它建议我们每年只需要添加1到2次自定义ID的条目

Kamil Folwarczny提供的解决方案是相互测试的,但是使用这种方法更好吗?或者(如果可以使用定义的ID进行迁移),通过维护每年迁移数据1到2次?

没有现成的解决方案。如果你想这样做,你需要让你自己的Id值赋值。一旦我们首先使用EF代码,更好的方法就是重写SaveChanges方法。在那里,您可以检查实体状态和类型,如果它是您添加了状态的实体,那么您可以检查它的Id。如果它等于0,您需要从DB中获取最大Id并递增它。
您需要在手动分配时检查重复Id。

这更像是一种黑客攻击,然后是水晶般清晰的解决方案。可以通过注释
[数据库生成(DatabaseGeneratedOption.Computed)]

您可以创建如下内容:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [Key]
    public int Id
    {
        get {
            if (_id == 0)
            {
                using (Context context = new Context())
                {
                    return context.DbSetOfEntity.OrderBy(s => s.Id).ToList().Last().Id + 1;
                }
            }
            else
            {
                return _id;
            }
        }
        set {
             _id = value;
        }
    }

    [NotMapped]
    private int _id;
现在,如果您从表单中提供
Id
,它将正常保存您指定的Id。但是,如果将
Id
留空(0是因为
int
)。它将在表中找到上次使用的
Id
,并将其递增1

实体创建后,它将保留其值,无论是生成的还是指定的

编辑


如果您一年只需要插入几次带有自定义id的行,那么这可能是一个可行的解决方案。

我认为我在这里没有帮助。我从未使用EF迁移过数据库。然而,根据你的编辑,我认为这可能是一个很好的起点。