【问题标题】:T4 POCO. Foreign Key Relationships (List<T> or T?)T4 POCO。外键关系(List<T> 还是 T?)
【发布时间】:2013-09-07 00:48:52
【问题描述】:

我使用 SMO 为我们的 POCO 对象创建了一个 T4 模板,以从 SQL Server 获取对象详细信息。现在我正在尝试确定如何确定导航属性的数据类型。我的主要问题是如何确定它应该是T 还是List&lt;T&gt;

我没有使用 EF 或 Linq to SQL。

关于我应该检查什么以准确确定数据类型有什么想法吗?

【问题讨论】:

  • 我通常会查看相关表中的列是否有索引。如果索引强制唯一性,那么 T?。其他时候有命名约定,但这显然取决于项目

标签: foreign-keys poco t4


【解决方案1】:

我一直在寻找一种确定外键基数的方法。我相信这可以通过检查主键列的唯一性来完成,但是,我们选择自己对导航属性进行硬编码,而不必担心这一点以及为属性自动生成名称.

【讨论】:

    【解决方案2】:

    根据您使用的 SQL 版本,您可以使用 INFORMATION_SCHEMA 来获取构建 POCO 所需的一切。以下来自http://searchcode.com/codesearch/view/15361587。它列出了所有表和列以及许多属性,包括该列是否为外键。

    SELECT 
    --TBL.TABLE_SCHEMA,
    TBL.TABLE_TYPE, 
    COL.TABLE_NAME,
    COL.ORDINAL_POSITION,
    COL.COLUMN_NAME,
    COL.DATA_TYPE,
    COL.IS_NULLABLE,
    ISNULL(COL.CHARACTER_MAXIMUM_LENGTH,-1) AS MAXIMUM_LENGTH,
    --COL.TABLE_CATALOG,
    (CASE KEYUSG.CONSTRAINT_TYPE WHEN 'PRIMARY KEY' THEN 'YES' ELSE 'NO' END) PRIMARY_KEY,
    (CASE KEYUSG.CONSTRAINT_TYPE WHEN 'FOREIGN KEY' THEN 'YES' ELSE 'NO' END) FOREIGN_KEY,
    FK.FOREIGN_TALBE,
    FK.FOREIGN_COLUMN,
    KEYUSG.CONSTRAINT_NAME
    FROM
    INFORMATION_SCHEMA.COLUMNS COL
    JOIN
    INFORMATION_SCHEMA.TABLES TBL
    ON
    COL.TABLE_NAME=TBL.TABLE_NAME 
    
        LEFT JOIN
        (
        SELECT 
        USG.CONSTRAINT_NAME,
        USG.TABLE_NAME,
        USG.COLUMN_NAME,
        CONST.CONSTRAINT_TYPE
         FROM
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE USG
        JOIN
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS CONST
        ON
        USG.TABLE_NAME=CONST.TABLE_NAME
        AND
        USG.CONSTRAINT_NAME = CONST.CONSTRAINT_NAME
        ) 
        AS KEYUSG
    ON
    COL.TABLE_NAME=KEYUSG.TABLE_NAME
    AND
    COL.COLUMN_NAME=KEYUSG.COLUMN_NAME
    
    ---FOREIGHTKEYS
        LEFT OUTER JOIN
        (
        SELECT 
        USAGE.TABLE_NAME,
        USAGE.COLUMN_NAME,
        UNI_USAGE.TABLE_NAME FOREIGN_TALBE,
        UNI_USAGE.COLUMN_NAME FOREIGN_COLUMN,
        CONST.CONSTRAINT_NAME,
        UNIQUE_CONSTRAINT_NAME
        FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONST
        JOIN
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE USAGE
        ON
        USAGE.CONSTRAINT_NAME=CONST.CONSTRAINT_NAME 
        JOIN
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE UNI_USAGE
        ON
        UNI_USAGE.CONSTRAINT_NAME=CONST.UNIQUE_CONSTRAINT_NAME 
        ) 
        AS FK
    ON
    FK.TABLE_NAME=COL.TABLE_NAME 
    AND
    FK.COLUMN_NAME = COL.COLUMN_NAME
    AND 
    KEYUSG.CONSTRAINT_NAME=FK.CONSTRAINT_NAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多