Как получить триггер удаления, работающий с использованием свободного API в EF CodeFirst CTP5? - PullRequest
4 голосов
/ 20 марта 2011

У меня возникают проблемы с набором ссылочной целостности, достаточной для срабатывания моего триггера удаления.

У меня есть зависимый объект с тремя 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-интерфейсы могут быть «беглыми», я нахожу их далеко не интуитивными.

...