如何在实体框架 (EF6) 中获取 sql 表的扩展属性
本文关键字:sql 获取 属性 扩展 实体 框架 EF6 | 更新日期: 2023-09-27 18:32:57
我在VS-2013工作。我添加了包含以下内容ADO.NET Entity Data Model
:
- 来自数据库的 EF 设计器,
- 代码优先来自数据库
连接到我的数据库中的一些表,它生成了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
我设法以这种方式从 Db 检索我的扩展属性:
- 通过Nuget Tiraggo库(
Install-Package Tiraggo.Edmx
(添加。它带来了对 edmx 文件中一些有用元数据的访问。 -
将下面列出的引用和命名空间添加到您的 *.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" #>
-
然后使用适当的连接字符串创建一个数据库上下文的实例(您可以通过实例化
typeMapper
、ef
、code
等来执行此操作(var dbContext = new DbContext(yourConnectionString)
-
使用 Tiraggo 库创建 edmx 对象的实例。(edmxLocation 是
edmx
文件的路径字符串(Edmx edmx = Edmx.Load(edmxLocation);
-
将静态方法添加到 *.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(); }#>
因此,此方法将按名称从表的列中检索扩展属性。
-
在循环
foreach
创建一个信息对象以获取具体实体的元数据var entityInfo = new TiraggoEntityInfo(edmx, entity.FullName);
-
通过调用静态方法检索扩展属性值:
string extendedPropertyValue = GetExtendedProperty(dbContext, entityInfo.StorageInfo.Schema, entityInfo.StorageInfo.Name, edmProperty.Name, extendedPropName);
-
这是我的完整模板。我已经删除了一些代码,模板可能处于不可编译的状态,但您可以在那里看到代码的用法。
附言希望,它会有所帮助。抱歉格式不正确