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

问题描述 投票:3回答:1

我正在VS-2013中工作。我添加了ADO.NET Entity Data Model,其中包含:

  1. 来自数据库的EF Designer,
  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
c# sql-server-2008 entity-framework-6 t4 edmx
1个回答
1
投票

我设法通过这种方式从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. 然后使用适当的连接字符串创建db上下文的实例(您可以在实例化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. 这是我的完整template。我已经删除了一些代码,并且模板可能处于无法编译的状态,但是您可以在其中看到代码的用法。

P.S。希望会有所帮助。抱歉,格式化不正确

© www.soinside.com 2019 - 2024. All rights reserved.