我有一个实体
datatables
由于某种原因,我需要手动输入一些ID。 如果未提供ID(等于0),是否可以自动添加下一个可用ID(整数)?
它应该像Identity字段一样工作,但是在某些特殊情况下可以手动定义id。
编辑:
当我们将数据从现有数据库迁移到新数据库时,是否可以手动定义ID,而ID字段是新数据库中的主键?
经过一番会谈,我们估计每年需要添加一些自定义ID只有1或2次的条目。
Kamil Folwarczny提供的解决方案很有趣,但是使用此黑客还是更好(如果可以使用定义的ID进行迁移),则每年进行一次维护一次或两次迁移数据?
答案 0 :(得分:1)
这更像是破解然后是透明的解决方案。可以通过注释import pymysql
conn = pymysql.connect(user = 'user', password = 'passwd'
, database = 'db', host = 'hst', ssl = {'ssl' : {'ca': 'pathtosll/something.pem'}})
您可以创建以下内容:
[DatabaseGenerated(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
并将其递增1。
一旦创建了实体,它将保留其值,无论是生成还是指定。
编辑
如果您每年只需要插入几次具有自定义ID的行,那么this可能是可行的解决方案。
答案 1 :(得分:0)
没有“开箱即用”的解决方案。如果要这样做,则需要创建自己的Id值分配器。一旦我们首先使用EF代码,更好的方法将是重写SaveChanges方法。在这里,您可以检查实体状态和类型,如果它是具有添加状态的实体,则可以检查它的ID。如果等于0,则需要从数据库中获取最大的ID并将其递增。 并且您需要检查手动分配的重复ID。