在linq to sql中你做了一个"触发器"通过对dbml文件创建一个部分类,然后插入一个部分方法。这是一个不会做任何事情的例子,因为它调用了内置删除。
partial void DeleteMyTable(MyTable instance)
{
//custom code here
ExecuteDynamicDelete(instance);
//or here :-)
}
但你怎么做"触发"在linq到实体?
答案 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无关。