你如何在Linq中向实体触发?

时间:2014-09-25 09:21:11

标签: c# entity-framework

在linq to sql中你做了一个"触发器"通过对dbml文件创建一个部分类,然后插入一个部分方法。这是一个不会做任何事情的例子,因为它调用了内置删除。

partial void DeleteMyTable(MyTable instance)
{
    //custom code here
    ExecuteDynamicDelete(instance);
    //or here :-)
}

但你怎么做"触发"在linq到实体?

1 个答案:

答案 0 :(得分:0)

您可以查看一些可覆盖的方法,例如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文件中生成的内容,找到可以在数据访问层中挂钩某些行为的位置

正如Ben Robinson指出的那样,这与linq无关,而是与实体框架中的生成代码或linq to sql无关。