Entity framework 如何在EF CodeFirst CTP5中使用fluent API使删除触发器工作?
我很难获得足够的引用完整性,以允许我的删除触发器触发 我有一个具有三个FK的从属实体。我希望在删除任何主要实体时将其删除 对于主体实体角色和组织单元(见下文),我可以依赖约定来创建所需的一对多关系,级联删除可以实现我的目的,即:删除任一主体时,关联将被删除 然而,对于成员,我有多个SQL Server不喜欢的级联删除路径(此处未显示),所以我需要使用fluent API禁用级联删除 这是我的(简化)模型: 问题-- 当我运行这个程序时,创建一个角色、一个成员、一个组织单位和一个将这三者联系在一起的协会都是可以的。当我删除角色时,关联会像我预期的那样被级联删除,OrgUnit也是如此。-然而,当我删除成员时,我会得到一个异常,其中有一个引用完整性错误。我已尝试设置级联集NULL,因为我的memberid FK可为NULL,但SQL再次抱怨有多个级联路径,因此显然我无法级联成员关联关系中的任何内容 要使其工作,我必须将以下代码添加到Seed(): 如您所见,这将删除由模型生成器创建的约束 问:这感觉像是一次彻底的黑客攻击。有没有一种方法可以使用fluentapi来表示不应该检查引用完整性,或者让引用完整性放松到足以让成员delete工作并允许触发触发器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禁用级联删除 这是我的(简化)模型: 问题-- 当我运行这个程序时,创建一个角色、一个成员、一个组织单位和一个将这三者联系在一起
提前感谢您提供的任何帮助。尽管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");