【问题标题】:Override default SQL generation in EF 6 based on entity type根据实体类型覆盖 EF 6 中的默认 SQL 生成
【发布时间】:2018-05-30 08:42:06
【问题描述】:

有一个典型的实体类

public class MyTable {
    public Guid Id {get;set;}
    public string Name {get;set;}
}

EF 生成如下内容:

    CreateTable(
        "dbo.MyTable",
        c => new
            {
                Id = c.Guid(nullable: false),
                Name = c.String(nullable: false, maxLength: 128),
            })
        .PrimaryKey(t => t.Id)

我想从接口IMyInterface继承我的一些实体类:

public interface IMyEnterface {}

然后我想覆盖默认生成,以便迁移任何实现的类 IMyInterface 自动看起来像这样:

    CreateTable(
        "dbo.MyTable",
        c => new
            {
                Id = c.Guid(nullable: false),
                Name = c.String(nullable: false, maxLength: 128),
            })
        .PrimaryKey(t => t.Id)

    Sql(@"EXEC sys.sp_addextendedproperty bla-bla-bla");

EF 6.2 中是否有任何扩展点允许这样做?

【问题讨论】:

  • 您可以编写自己的迁移操作。尽管我不知道您是否会根据界面自动获得它,但您也许可以利用它来使自己至少更容易一些。请参阅此处的两个示例。 romiller.com/tag/migrationoperation(查看它们,您也许可以添加一些反射来检测 Up 方法中的接口)
  • @pinkfloydx33 您应该将其发布为答案!
  • @MichalCiechan 如果我对此有足够的了解,我会的。在单击另一个 SO 评论中的链接后,我只是偶然在周末阅读了这些文章。我对 EF 几乎一无所知

标签: c# sql .net entity-framework entity-framework-6


【解决方案1】:

Seed 方法更容易做到:

var tables = context.GetType().GetProperties()
    .Where(x => 
        x.PropertyType.GenericTypeArguments
        .Any(y => typeof(IMyEnterface).IsAssignableFrom(y))
        );

foreach (var table in tables)    
    if(sp_NotExecutedYet(table))
        context.Database
           .ExecuteSqlCommand($"EXEC sys.sp_addextendedproperty {propertyNameFor(table)}");

【讨论】:

  • 这是一个不错的选择,谢谢。我们在项目中使用的 ef-enum-to-lookup 扩展做了类似的事情来生成枚举表的 FK。不过这会增加种子时间,所以我仍然希望有一种方法可以在迁移中做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2019-12-01
  • 1970-01-01
  • 2020-04-17
  • 2013-10-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多