У меня возникают проблемы с набором ссылочной целостности, достаточной для срабатывания моего триггера удаления.
У меня есть зависимый объект с тремя FK.Я хочу, чтобы он был удален при удалении любой из основных сущностей.
Для основных сущностей Role и OrgUnit (см. Ниже) я могу положиться на условные обозначения для создания требуемой взаимосвязи один-много, и каскадное удаление делает то, что яхочу, т. е .: ассоциация удаляется при удалении любого участника.
Для члена, однако, у меня есть несколько путей каскадного удаления (здесь не показаны), которые не нравятся SQL Server, поэтому мне нужно использовать свободный 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; }
}
Мой первый запуск беглого кода API выглядит следующим образом:
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);
}
My seedФункция создает триггер удаления:
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");
}
ПРОБЛЕМА - Когда я запускаю это, создаю Роль, Участника, OrgUnit и Ассоциацию, связывая три вместе, все в порядке.Когда я удаляю роль, ассоциация удаляется каскадом, как я и ожидал, так же, как и в OrgUnit.- ОДНАКО - при удалении члена я получаю исключение с ошибкой ссылочной целостности.Я попытался установить ON CASCADE SET NULL, потому что мой членский FK обнуляется, но SQL снова жалуется на множественные каскадные пути, поэтому, очевидно, я ничего не могу каскадировать в отношениях Member-Association.
Чтобы заставить это работать, я должен добавитьследующий код для Seed ():
context.Database.SqlCommand("ALTER TABLE dbo.ACLEntries DROP CONSTRAINT member_associations");
Как видите, это снимает ограничение, созданное построителем модели.
ВОПРОС: это похоже на полный взлом.Есть ли способ использовать беглый API для меня, чтобы сказать, что ссылочная целостность НЕ должна проверяться, или как-то иначе, чтобы она достаточно расслаблялась, чтобы удаление Участка работало и позволяла запускать триггер?
Заранее спасибоза любую помощь, которую вы можете предложить.Хотя беглые API-интерфейсы могут быть «беглыми», я нахожу их далеко не интуитивными.