有没有办法从 DbModelBuilder modelBuilder (Fluent API) 访问在 SaveChanges() 上创建的主键

Is there a way to access primary key created on SaveChanges() from the DbModelBuilder modelBuilder (Fluent API)

我有一个基于实体 ID 的 属性。所以我试图避免以下代码:

dbContext.SaveChanges();
entyty.propertyInQuestion = SomeFunkyMethod(entity.Id)
dbContext.SaveChanges();

所以我们的想法不是覆盖 SaveChanges(),而是将 SomeFunkyMethod 放在 Fluent API 的某个地方。到目前为止,我最好的猜测是在 ValueGenerator 中进行,但它似乎是为不同的目的而设计的。

如果您需要为此使用 EF,那么答案介于 "no" 和 "badly" 之间。

如何创建一个在插入后更新 属性 的数据库触发器?

(取决于您的数据库子系统,此处为 postgres)

CREATE FUNCTION some_funky_method() RETURNS trigger AS $$
BEGIN

    -- whatever implemenation of your logic
    NEW."UpdatedProperty" := NEW."Id" * 666;

    RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER update_property_on_insert
AFTER INSERT ON your_table
FOR EACH ROW
EXECUTE PROCEDURE some_funky_method();

更新

无法使用 EntityFramework 和 auto-incremented ID 执行此操作。 Id 是在插入时由数据库序列生成的,这就是重点。如果您不能使用触发器,任何其他解决方案都只是一个丑陋的黑客攻击,导致在某个时候进行第二次数据库调用。

当然,您可以通过查询序列状态来预测 Id,但这通常是一个非常糟糕的主意。

但是,如果有可能,还有另一种选择 - 将主键从 INT 更改为 GUID。 此时,您可以自己生成 Id 并将其用于任何 before insert.

public class MyEntity {
   public Guid Id { get; set; }
   public string SomethingElse { get; set; }
   (...)
}
entity.Id = Guid.NewGuid();
entity.SomethingElse = /* Do something with the Id */ entity.Id.ToString();
_db.SaveChanges();