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

时间:2014-12-03 06:54:50

标签: c# sql-server-2008 entity-framework-6 t4 edmx

我在VS-2013工作。我已添加ADO.NET Entity Data Model包含:

  1. 来自数据库的EF Designer,
  2. Code First From Database
  3. 连接到我的数据库中的某些表,它生成了带有部分类的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
    

1 个答案:

答案 0 :(得分:1)

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

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

    之间添加了它们

    &lt;#@ assembly name =&#34; $(ProjectDir)TiraggoEdmx \ TiraggoEdmx.EF.dll&#34; #&GT;
    &lt;#@ assembly name =&#34; System.Configuration&#34; #&GT;
    &lt;#@ import namespace =&#34; System.Data&#34; #&GT;
    &lt;#@ import namespace =&#34; System&#34; #&GT;
    &lt;#@ import namespace =&#34; System.Xml.Serialization&#34; #&GT;
    &lt;#@ import namespace =&#34; TiraggoEdmx_v3&#34; #&GT;
    &lt;#@ import namespace =&#34; System.Data.Entity&#34; #&GT;
    &lt;#@ import namespace =&#34; System.Configuration&#34; #&GT;
    &lt;#@ import namespace =&#34; System.Linq&#34; #&GT;

  3. 然后使用正确的连接字符串创建db上下文的实例(您可以在typeMapperefcode等实例化的情况下在附近执行此操作。

    var dbContext = new DbContext(yourConnectionString)

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

    Edmx edmx = Edmx.Load(edmxLocation);

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

    &LT;#+      public static string GetExtendedProperty(DbContext context,string schema,string tableName,string columnName,string propName) {

    var query = context.Database.SqlQuery( string.Format(&#34; SELECT value FROM fn_listextendedproperty(NULL,&#39; schema&#39;,&#39; {0}&#39;,&#39; table&#39;,&#39; { 1}&#39;,&#39;列&#39;,&#39; {2}&#39;)其中objname =&#39; {2}&#39; AND name =&#39; { 3}&#39;&#34;,架构,tableName,columnName,propName));

    return query.FirstOrDefault();

    }#&GT;

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

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

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

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

      string extendedPropertyValue = GetExtendedProperty(dbContext,entityInfo.StorageInfo.Schema, entityInfo.StorageInfo.Name,edmProperty.Name,extendedPropName);

    3. 以下是我的完整template。我删除了一些代码,模板可能处于无法编译状态,但您可以看到代码的使用情况。

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