Entity framework 如何在EF CodeFirst CTP5中使用fluent API使删除触发器工作?

Entity framework 如何在EF CodeFirst CTP5中使用fluent API使删除触发器工作?,entity-framework,ef-code-first,fluent-interface,Entity Framework,Ef Code First,Fluent Interface,我很难获得足够的引用完整性,以允许我的删除触发器触发 我有一个具有三个FK的从属实体。我希望在删除任何主要实体时将其删除 对于主体实体角色和组织单元(见下文),我可以依赖约定来创建所需的一对多关系,级联删除可以实现我的目的,即:删除任一主体时,关联将被删除 然而,对于成员,我有多个SQL Server不喜欢的级联删除路径(此处未显示),所以我需要使用fluent API禁用级联删除 这是我的(简化)模型: 问题-- 当我运行这个程序时,创建一个角色、一个成员、一个组织单位和一个将这三者联系在一起

我很难获得足够的引用完整性,以允许我的删除触发器触发

我有一个具有三个FK的从属实体。我希望在删除任何主要实体时将其删除

对于主体实体角色和组织单元(见下文),我可以依赖约定来创建所需的一对多关系,级联删除可以实现我的目的,即:删除任一主体时,关联将被删除

然而,对于成员,我有多个SQL Server不喜欢的级联删除路径(此处未显示),所以我需要使用fluent API禁用级联删除

这是我的(简化)模型:

问题-- 当我运行这个程序时,创建一个角色、一个成员、一个组织单位和一个将这三者联系在一起的协会都是可以的。当我删除角色时,关联会像我预期的那样被级联删除,OrgUnit也是如此。-然而,当我删除成员时,我会得到一个异常,其中有一个引用完整性错误。我已尝试设置级联集NULL,因为我的memberid FK可为NULL,但SQL再次抱怨有多个级联路径,因此显然我无法级联成员关联关系中的任何内容

要使其工作,我必须将以下代码添加到Seed():

如您所见,这将删除由模型生成器创建的约束

问:这感觉像是一次彻底的黑客攻击。有没有一种方法可以使用fluentapi来表示不应该检查引用完整性,或者让引用完整性放松到足以让成员delete工作并允许触发触发器


提前感谢您提供的任何帮助。尽管fluent API可能是“流畅的”,但我发现它们远远不够直观。

是否要求在数据库触发器中删除关联?
public class Association
{
    public int id { get; set; }
    public int roleid { get; set; }
    public virtual Role role { get; set; }
    public int? memberid { get; set; }
    public virtual Member member { get; set; }
    public int orgunitid { get; set; }
    public virtual OrgUnit orgunit { get; set; }
}

public class Role
{
    public int id { get; set; }
    public virtual ICollection<Association> associations { get; set; }
}

public class Member
{
    public int id { get; set; }
    public virtual ICollection<Association> associations { get; set; }
}

public class Organization
{
    public int id { get; set; }
    public virtual ICollection<Association> associations { get; set; }
}
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        DbDatabase.SetInitializer<ConfDB_Model>(new ConfDBInitializer());

        modelBuilder.Entity<Member>()
            .HasMany(m=>m.assocations)
            .WithOptional(a=>a.member)
            .HasForeignKey(a=>a.memberId)
            .WillCascadeOnDelete(false);
    }
    protected override void Seed(ConfDB_Model context)
    {
        context.Database.SqlCommand("CREATE TRIGGER MemberAssocTrigger ON dbo.Members FOR DELETE AS DELETE Assocations FROM Associations, deleted WHERE Associations.memberId = deleted.id");
    }
    context.Database.SqlCommand("ALTER TABLE dbo.ACLEntries DROP CONSTRAINT member_associations");