【问题标题】:How to get extended properties of sql table in Entity framework (EF6)?如何在实体框架(EF6)中获取 sql 表的扩展属性?
【发布时间】:2014-12-03 06:54:49
【问题描述】:

我在 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

【问题讨论】:

  • 您是否想在对象中看到这些扩展属性?
  • 是的,我想在model.ttT4 模板文件中显示SQL 表的扩展 属性。

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


【解决方案1】:

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

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

    <#@ 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。我删除了一些代码,模板可能处于不可编译状态,但您可以在此处看到代码的使用情况。

附:希望,它会有所帮助。格式不当见谅

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2015-10-05
    • 2014-04-28
    相关资源
    最近更新 更多