具有自动增量的自定义键

Custom key with autoincrement

我有一个实体

entity.Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

因为某些原因,我需要手动输入一些id。 如果没有提供id(等于0)是否可以自动添加下一个可用的id(int)?

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

EDIT :

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

经过一番讨论,我们似乎需要添加一些具有自定义 ID 的条目,每年只有 1 或 2 次。

Kamil Folwarczny 提供的解决方案很有趣,但是使用这个 hack 更好还是(如果可以使用定义的 ID 迁移)每年迁移 1 或 2 次数据并进行维护?

没有 "out of the box" 解决方案。如果你想这样做,你需要制作你自己的 Id 值分配器。一旦我们首先使用 EF 代码,更好的方法是覆盖 SaveChanges 方法。在那里您可以检查实体状态和类型,如果它是您的具有已添加状态的实体,那么您可以检查它的 ID。如果它等于 0,则需要从 DB 中获取最大的 Id 并递增它。 并且您需要在手动分配时检查重复的 Id。

这更像是一个 hack 然后 crystal 明确的解决方案。可以用注释 [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)。它将在 table 中找到最后使用的 Id 并将其递增 1.

一旦实体被创建,它将保留它的值,无论是生成的还是指定的。

Edit

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