c# - Entity Framework Core 自定义脚手架

标签 c# entity-framework-core

我已经搭建了我的 SQLServer 数据库。 并在指定文件夹中创建 POCO 对象。我想做的是它从我的基类扩展而来。我还使用存储库模式,所以我需要在每个实体上都有 Id 键,我不想每次重新构建数据库时都更改它。

脚手架模型示例

public partial class Food
{
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
     public double Price { get; set; }
}

预期结果:

public partial class Food : EntityBase
{
     public string Name { get; set; }
     public string Description { get; set; }
     public double Price { get; set; }
}

public class EntityBase : IEntityBase
{
    public int Id { get; set; }
}

最佳答案

您可以使用 DbContextWriter & EntityTypeWriter自定义脚手架输出。

在较新版本的实体核心编写器中重命名:

  • DBContextWriter ==>> CSharpDbContextGenerator
  • EntityTypeWriter ==>> CSharpEntityTypeGenerator

编写一些自定义类型编写器,您可以覆盖所有内容,您将获得自己的代码生成器:

//HERE YOU CAN CHANGE THE WAY TYPES ARE GENERATED AND YOU CAN ADD INTERFACE OR BASE CLASS AS PARENT.
public class CustomEntitiyTypeWriter : EntityTypeWriter
{
    public CustomEntitiyTypeWriter([NotNull] CSharpUtilities cSharpUtilities)
        : base(cSharpUtilities)
    { }

    // Write Code returns generated code for class and you can raplec it with your base class
    public override string WriteCode([NotNull] EntityConfiguration entityConfiguration)
    {
        var classStr = base.WriteCode(entityConfiguration);

        var defaultStr = "public partial class " + entityConfiguration.EntityType.Name;
        var baseStr = "public partial class " + entityConfiguration.EntityType.Name + " : EntityBase";

        classStr = classStr.Replace(defaultStr, baseStr);

        return classStr;
    }      
}

在设置中声明它:

public static void ConfigureDesignTimeServices(IServiceCollection services)
           => services.AddSingleton<EntityTypeWriter, CustomEntitiyTypeWriter>();

然后是 scaffold db,您可以使用 CustomDBContextWriter 对 DBContext 执行相同的操作。

关于c# - Entity Framework Core 自定义脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40728223/

相关文章:

c# - 有没有人对 [Authorize] 属性如何处理标准 ASP.NET MVC 5 应用程序中的路由有很好的解释?

c# - 这是使用 goto 的安全方法吗?

entity-framework - 调用新的 DbContext 时,DbContextOptions 中的内容是什么?

c - SQLException : Invalid column name 'CreateRequestViewModelRequestId'

c# - 如何使用任务并行库在 C# 中执行 PowerShell 脚本

c# - ClickOnce appref-ms 文件位置?

c# - 等到表单加载完成

asp.net-core - 在 EF 核心的 OnModelCreating 中创建一个用户和角色

entity-framework - EF Core 2.0/2.1 - 如何有效地处理不常访问的大型列?

c# - options.UseOracle() 在 EF Core 中不可用