如何在Linq中为实体生成触发器
本文关键字:实体 触发器 Linq | 更新日期: 2023-09-27 18:24:29
在linq-to-sql中,您可以通过对dbml文件创建一个分部类,然后插入一个分部方法来创建一个"触发器"。下面是一个不会做任何事情的示例,因为它调用了内置删除。
partial void DeleteMyTable(MyTable instance)
{
//custom code here
ExecuteDynamicDelete(instance);
//or here :-)
}
但是如何在linq中对实体执行"触发器"呢?
您可以查看一些可重写的方法,如SaveChanges
,在这些方法中,您可以在实体到达数据库之前对其进行调整。
这里有一个例子,直接来自我们在商店里的一些代码,我们在那里确保ReadOnlyContext
不会向DB:写入任何内容
public class ReadOnlyEntities : Entities
{
public bool EnforceReadonlyBehavior { get; set; }
public ReadOnlyEntities(string connectionString)
: base(connectionString)
{
EnforceReadonlyBehavior = true;
}
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
if (EnforceReadonlyBehavior)
{
if (
ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Any()
||
ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).Any()
||
ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted).Any()
)
{
throw new InvalidOperationException("nope");
}
}
return base.SaveChanges(options);
}
}
这可以让你做很多有趣的事情,比如自动设置一些值(创建日期/修改日期)。您还可以在OnContextCreated
中捕捉上下文的创建,在那里您可以设置所有类型的特定行为。
实体本身也有一些分部方法。查看edmx后面的reference.cs文件中生成的内容,以找到可以在数据访问层中挂接一些行为的位置
正如BenRobinson所指出的,这与linq无关,而是与实体框架或linq-to-sql中生成的代码无关。