如何在实体框架 (EF6) 中获取 sql 表的扩展属性

本文关键字:sql 获取 属性 扩展 实体 框架 EF6 | 更新日期: 2023-09-27 18:32:57

我在VS-2013工作。我添加了包含以下内容ADO.NET Entity Data Model

  1. 来自数据库的 EF 设计器,
  2. 代码优先来自数据库

连接到我的数据库中的一些表,它生成了tt带有分部类的文件,并在表的每个字段上添加注释,如下所示

ms_item_cat.cs

public partial class ms_item_cat
{
    public ms_item_cat()
    {
        ms_items = new HashSet<ms_items>();
    }
    [Key]
    public int pk_icat_id { get; set; }
    [Required]
    [StringLength(50)]
    public string icat_name { get; set; }
    [StringLength(50)]
    public string icat_image_path { get; set; }
}

它没有显示我添加到表中的一些扩展属性,例如描述等

下面的脚本显示这些扩展属性:

select p.*, t.*
from sys.extended_properties p
inner join sys.tables t on p.major_id = t.object_id
where class = 1

如何在实体框架 (EF6) 中获取 sql 表的扩展属性

我设法以这种方式从 Db 检索我的扩展属性:

  1. 通过Nuget Tiraggo库(Install-Package Tiraggo.Edmx(添加。它带来了对 edmx 文件中一些有用元数据的访问。
  2. 将下面列出的引用和命名空间添加到您的 *.tt 文件中(其中一些对于您的目的可能是多余的,但我需要所有这些(。我已经将它们
    添加到 <#@ include file="EF6.Utility.CS.ttinclude"#>
    <#@ output extension=".cs"#>

    <#@ assembly name="$(ProjectDir)TiraggoEdmx'TiraggoEdmx.EF.dll" #> 
    <#@ assembly name="System.Configuration" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml.Serialization" #>
    <#@ import namespace="TiraggoEdmx_v3" #>
    <#@ import namespace="System.Data.Entity" #>
    <#@ import namespace="System.Configuration" #>
    <#@ import namespace="System.Linq" #>
    
  3. 然后使用适当的连接字符串创建一个数据库上下文的实例(您可以通过实例化typeMapperefcode等来执行此操作(

    var dbContext = new DbContext(yourConnectionString)

  4. 使用 Tiraggo 库创建 edmx 对象的实例。(edmxLocation 是edmx文件的路径字符串(

    Edmx edmx = Edmx.Load(edmxLocation);

  5. 将静态方法添加到 *.tt 文件的末尾

    <#+ public static string GetExtendedProperty(DbContext context, string schema, string tableName, string columnName, string propName) {
         var query = context.Database.SqlQuery<string>(string.Format("SELECT value FROM fn_listextendedproperty (NULL, 'schema', '{0}', 'table', '{1}', 'column', '{2}') where objname = '{2}' AND name = '{3}'", schema, tableName, columnName, propName));
         return query.FirstOrDefault();
    }#>
    

因此,此方法将按名称从表的列中检索扩展属性。

  1. 在循环foreach创建一个信息对象以获取具体实体的元数据

    var entityInfo = new TiraggoEntityInfo(edmx, entity.FullName);

  2. 通过调用静态方法检索扩展属性值:

    string extendedPropertyValue = GetExtendedProperty(dbContext, entityInfo.StorageInfo.Schema, entityInfo.StorageInfo.Name, edmProperty.Name, extendedPropName);
    
  3. 这是我的完整模板。我已经删除了一些代码,模板可能处于不可编译的状态,但您可以在那里看到代码的用法。

附言希望,它会有所帮助。抱歉格式不正确