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迁移过数据库。然而,根据你的编辑,我认为这可能是一个很好的起点。