c# - 是否为 DbSet 启用了删除级联?

标签 c# sql entity-framework generics

使用 Entity Framework,在从表中删除任何记录之前,如何判断表是否启用了 Delete Cascade?

public partial class DataContext : DbContext
{
    public DbSet<Building> Buildings { get; set; }
    public DbSet<Room>     Rooms     { get; set; }
}

DataContext context;
Building    building;

// Will this start a DELETE CASCADE, removing Rooms within the Building?
context.Buildings.Remove(building);

这是一个通用函数,所以我可以使用 DbSet 或 DbContext 但不能使用 T。
需要在运行时进行测试,就在调用 Remove() 之前。

您能否在执行删除之前检测到 DELETE CASCADE,如果可以,如何检测?

最佳答案

您可以很容易地使用 t-sql 函数或查询来为您提供所需的信息。尝试用您想要的任何谓词包装以下内容(例如,WHERE PK.TABLE_NAME = 'My Table' AND C.DELETE_RULE = 'CASCADE'。如果记录 a 存在,那么您就获得了所需的信息。

SELECT
    FK_TableName = FK.TABLE_SCHEMA + '.' + FK.TABLE_NAME,
    FK_ColumnName = CU.COLUMN_NAME,
    PK_TableName = PK.TABLE_SCHEMA + '.' + PK.TABLE_NAME,
    PK_ColumnName = PT.COLUMN_NAME,
    ConstraintName = C.CONSTRAINT_NAME,
    DeleteRule = C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
    SELECT
        i1.TABLE_NAME,
        i2.COLUMN_NAME
    FROM
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
        ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
    WHERE
        i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
   ) PT ON PT.TABLE_NAME = PK.TABLE_NAME;

然后您可以将其包装到 DbSet 扩展中并像 context.Set<MyEntity>().UsesCascadeDelete() 一样调用它它使用您的谓词和您想要的任何其他内容触发上述查询。

因为 EF 可以非常轻松地运行 TSQL 查询,所以我仍然认为它们是 EF 的“一部分”。

关于c# - 是否为 DbSet 启用了删除级联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998624/

相关文章:

c# - 用于车牌识别系统的 Java 或 C#?

c# - 为什么可空的模式匹配会导致语法错误?

sql - 具有由联接表的不同行组成的列的 select 语句

sql - Postgres 创建 View 而不是 View

c# - 不要在 "using"语句后处理属性

sql-server - 等效内存中的 SQL Server

c# - 使用 C# 中的 Windows 服务从 FTP 服务器复制并删除文件

c# - 用于从不同表中检索的 SQL 语法?

c# - Entity Framework groupby 子集合

c# - 在字符串中找到 "LEV"