如何在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中对实体执行"触发器"呢?

如何在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中生成的代码无关。