2

エンティティフレームワークとの関係を作成するための名前付け規則に基づいて1:nの関係を作成します。私はcodefirstを使用しています。 Entity Frameworkのは、規則を無視し、alwas代わりに一つだけの、2つの外部キー列を作成します(私はこのコラムをしたい) エンティティフレームワークコードファーストは、1:nの関係を作成するときにデータベースに2つの外部キー列を生成します。

  • StreamWorkerUser_Id1
  • は、構成クラスには、次のように構成されて

    • StreamWorkerUser_Id:

      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
      

      私はすべてのモデルにカスタムクラスを使用してMicrosoft.Identity Frameworkを使用しています。

      My DbContextクラスは次のように簡単です。

      public class StreamWorkerDataContext : IdentityDbContext<StreamWorkerUser, StreamWorkerRole, int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim> 
      { 
          public DbSet<Task> Tasks { get; set; } 
      } 
      

      Taskモデル:

      public class Task : StreamWorkerEntity 
      { 
          public StreamWorkerUser StreamWorkerUser { get; set; } 
      } 
      

      StreamWorkerUserモデル:

      public class StreamWorkerUser : IdentityUser<int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim> 
          { 
           public virtual List<Task> Tasks { get; set; } // also tested ICollection 
          } 
      

      Taskクラスはこの基本タイプから継承、ここでは、2つのタイプの特性StreamWorkerUser定義された(しかし、これらであります列はデータベース内で正しく生成されます)。

      プロパティはCreatorLastEditorのデータベース移行を妨げる可能性はありますか?

      慣例を正しく理解していますか?

      より多くの情報:

      • Entity Frameworkのバージョン6.1.3
      • Microsoft.AspNet.Identity.Core 2.2.1
      • Microsoft.AspNet.Identity.EntityFramework 2.2.1
      • ASP .NET 4 MVC 5
      • AzureのクラウドでのSQL Serverの
      • C#6.0
      • .NET Frameworkの4.5.2
      • このコードはすべてのクラスでlibary
    +0

    どのようにあなたは、あなたが唯一の外部キーをしたい場合は創造主とLastEditorに関係を保存したいですか? – faint220

    +0

    @ faint220私は1つの外部キーしか望んでいません。 3つあります。 1つは 'Creator'、1つは' LastEditor'、もうひとつは 'StreamWorkerUser'です。現在、Creator_Id、LastEditor_Id、StreamWorkerUser_Id、StreamWorkerUser_Id1の4つの列が生成されています。 –

    +0

    エンティティタイプの設定を試しましたか?あなたは流暢なAPIを使用して外部キーを明示的に宣言することができます – Efe

    答えて

    0

    あるので、あなたはこのような状況ではEFと思うかもしれない:

    public StreamWorkerUser Creator { get; set; } 
    public StreamWorkerUser LastEditor { get; set; } 
    

    がcreator_idとlasteditor_idを作成しますが、 StreamWorkerUser_Idがすでに使用されていたため、EFがクラス名を取り、StreamWorkerUser_IdとStreamWorkerUser_Id1を作成したため、そうではありません。デフォルトでは、(フィールドではなく)クラスごとにリレーションを作成する場合、EFはフィールド名ではなくクラス名に応じて列名を生成します。

    あなたが行うことができ、それらのFKの列名を指定したい場合は、次の

    public int CreatorId { get; set; } //this field name will be column name 
        [ForeignKey("StreamWorkerUser")] 
        public StreamWorkerUser Creator { get; set; } 
    
        public int EditorId { get; set; } //this field name will also be column name 
        [ForeignKey("StreamWorkerUser")] 
        public StreamWorkerUser Editor { get; set; } 
    
    +0

    ありがとう、私の場合は、列名はfieldnameから生成されます。質問の下のコメントをご覧ください。 –

    関連する問題