Entity Frameworkコアのスケッチングをカスタマイズする

c# entity-framework-core

質問

私は自分のSQLServerデータベースの足場を立てました。そして、指定されたフォルダにPOCOオブジェクトを作成します。私がしたいのは、それが私の基本クラスから拡張されているということです。私はまた、リポジトリパターンを使用するので、私はすべてのエンティティにIDキーを持っている必要がありますし、私は毎回データベースをrescaffoldを変更したくありません。

足場モデルの例

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; }
}

受け入れられた回答

DbContextWriterEntityTypeWriterを使用して足場の出力をカスタマイズできます。

新しいバージョンのエンティティコアライターの名前が変更されました:

  • 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に対して同じ処理を実行できます。


人気のある回答

@ Tornike Choladzeの優れた答えは私を正しい方向に導いてくれましたが、.Net Core(2.0>)の最新バージョンではこれはセットアップとは少し違っています。

カスタムエンティティタイプジェネレータ:

class MyEntityTypeGenerator : CSharpEntityTypeGenerator
{
    public MyEntityTypeGenerator(ICSharpUtilities cSharpUtilities) : base(cSharpUtilities) { }

    public override string WriteCode(IEntityType entityType, string @namespace, bool useDataAnnotations)
    {
        string code = base.WriteCode(entityType, @namespace, useDataAnnotations);

        var oldString = "public partial class " + entityType.Name;
        var newString = "public partial class " + entityType.Name + " : EntityBase";

        return code.Replace(oldString, newString);
    }
}

そして、 同じアセンブリクラスとIDesignTimeServices実装でIDesignTimeServices

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddSingleton<ICSharpEntityTypeGenerator, MyEntityTypeGenerator>();            
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ