带有自动增量的自定义键

时间:2018-09-25 11:05:14

标签: entity-framework entity-framework-6 ef-code-first ef-code-first-mapping

我有一个实体

datatables

由于某种原因,我需要手动输入一些ID。 如果未提供ID(等于0),是否可以自动添加下一个可用ID(整数)?

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

  

编辑:

当我们将数据从现有数据库迁移到新数据库时,是否可以手动定义ID,而ID字段是新数据库中的主键?

经过一番会谈,我们估计每年需要添加一些自定义ID只有1或2次的条目。

Kamil Folwarczny提供的解决方案很有趣,但是使用此黑客还是更好(如果可以使用定义的ID进行迁移),则每年进行一次维护一次或两次迁移数据?

2 个答案:

答案 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。