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

时间:2019-06-26 08:12:24

标签: c# entity-framework-core ef-fluent-api

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

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

所以这个想法不是重写SaveChanges()而是将SomeFunkyMethod放在Fluent API的某个位置。到目前为止,我最好的猜测是在ValueGenerator中执行此操作,但似乎它是为不同目的而设计的。

1 个答案:

答案 0 :(得分:1)

如果您需要为此使用EF,则答案在“否”和“严重”之间。

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

(取决于您的数据库子系统,此处为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和自动递增的ID无法做到这一点。 Id是在插入时由DB序列生成的,这就是重点。如果您不能使用触发器,则任何其他解决方案都只会是一个丑陋的破解,从而在某个时候导致第二次数据库调用。

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

但是,如果有可能,还有另一种选择-将主键从INT更改为 GUID 。 此时,您可以自己生成ID并将其用于插入之前 的任何内容。

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();