【问题标题】:Get default sql value from Entity Framework class从实体框架类获取默认 sql 值
【发布时间】:2016-10-06 11:35:18
【问题描述】:

我使用的 T4 模板对 this 答案中提出的模板稍作修改,以从我的 EF POCO 生成 typescript 接口。

EF Core POCO 是首先生成数据库的,并且某些数据库列具有默认值。这些由 EF 生成器正确映射到我的上下文中,例如.HasDefaultValueSql("0");

我对如何访问给定 EF 类的默认值有点困惑,我原以为 GetValueOrDefault 可能会解决问题,但这只是为 .net 类型提供默认值。

我看到有一些其他的解决方案可以让这个工作,但我似乎找不到一个还可以与 ASP .Net Core 一起工作的解决方案。

理想情况下,我想知道如何从其 MemberInfo 中确定属性是否具有默认 EF 值,因为 T4 模板中的以下行正在生成属性描述,修改它以输出默认值是最简单的TypeScript 定义的值。

foreach (MemberInfo mi in GetInterfaceMembers(t))
{
    sb.AppendFormat("  {0}: {1};\n", mi.Name, GetTypeName(mi));
}

【问题讨论】:

  • 如果您使用 data-annotation 属性设置默认值会容易得多。像[DefaultValue("0")] 这样的东西。然后您可以使用MemberInfo.CustomAttributes 轻松访问它
  • 您是否可以访问模板内的源DbContext
  • @haim770 我正在从已经存在的数据库中生成类,我不拥有数据库,如果它发生变化,我希望能够在不手动检查默认值的情况下重新生成
  • @IvanStoev 我想我可以访问模板内的 dbcontext,我混合了 EF 和非 EF 类,但我可以轻松地将其拆分为 2 个模板

标签: c# entity-framework asp.net-core t4


【解决方案1】:

如果您可以访问生成的DbContext,则可以使用DbContext.Model 提供的元数据而不是反射。

例如:

foreach (var type in db.Model.GetEntityTypes())
{
    foreach (var property in type.GetProperties())
    {
        var defaultValue = property.Relational().DefaultValue;
    }
}

还有很多有用的方法,如IModel.FindEntityTypeIEnityType.FindProperty等。

【讨论】:

  • 我正在努力让它引用 T4 模板中 RelationalMetadataExtensions 的扩展方法,此代码在类中运行良好,但我在文本模板中收到 'IProperty' does not contain a definition for 'Relational' 错误。有什么想法吗?
  • 啊,我知道了,我必须引用程序集 dll,然后还要引用命名空间。
  • 确实如此。程序集:Microsoft.EntityFrameworkCore.Relational,命名空间:Microsoft.EntityFrameworkCore
  • 嗯,它为所有内容返回 null,即使其中一些在上下文中肯定有默认值
  • 啊哈,使用sql server 所以是property.SqlServer().DefaultValueSql;
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多