我有一个基于实体ID的属性。所以我试图避免以下代码:
dbContext.SaveChanges();
entyty.propertyInQuestion = SomeFunkyMethod(entity.Id)
dbContext.SaveChanges();
所以这个想法不是重写SaveChanges()而是将SomeFunkyMethod放在Fluent API的某个位置。到目前为止,我最好的猜测是在ValueGenerator中执行此操作,但似乎它是为不同目的而设计的。
答案 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();