2

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

我没有使用 EF 或 Linq to SQL。

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

4

2 回答 2

1

根据您使用的 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
于 2013-09-29T15:30:44.870 回答
0

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

于 2013-10-07T20:07:51.773 回答