有没有办法从 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();
我有一个基于实体 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();