2016-10-27 18 views
0

私の外来キー列に必要な名前を付けようとしています。EFコアの流暢なAPIにForeignKey列名を設定する方法

私はbuilder.Propertyと私のForeignKeyを設定した場合、私は関係を作成するときに、

var b = builder.Property(column.PropertyType, column.PropertyName); 
b.ForSqlServerHasName("MyFKColumnName"); 

、別名、私は、移行のエラーを持っている: 「ナビゲーションプロパティ 『LettreClePrincipale』エンティティに追加することはできませんエンティティタイプ 'LettreCleAssociation'に同じ名前のプロパティが既に存在するため、 'LettreCleAssociation'と入力してください。 "

私はbuilder.Propertyと私のForeignKeyを設定しない場合、このエラーは、消えたキーが正しく作成されていますが、私はプロセス中に名前を設定することはできません。

ltcLinkBuilder.HasOne(typeof(LTC).FullName, "Link1") 
.WithMany().IsRequired() 
.HasForeignKey("Link1ID").OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Cascade) 
.??? 

私は私を定義しましたこのようなモデル(より多くのプロパティを聖霊降臨祭)

class LTC 
     { 
      public int TestA { get; set; } 
      public string TestB { get; set; } 

      public Guid Id { get; set; } 

      protected ICollection<LTCLinks> _links { get; set; } 

      public IReadOnlyList<LTCLinks> Links 
      { 
       get 
       { 
        return _links.ToList().AsReadOnly(); 
       } 
      } 
     } 

     class LTCLinks 
     { 
      public Guid Link1ID { get; set; } 
      public LTC Link1 { get; set; } 
      public Guid? Link2ID { get; set; } 
      public LTC Link2 { get; set; } 

      public string Data { get; set; } 
     } 

私はここにForSqlServerHasNameまたはForSqliteHasName拡張メソッドを持っていません。これを達成するにはどうすればいいですか?

EFCore 1.1プレビュー1

+0

はあなたのエンティティクラスをしてください表示します。 – Dmitry

+0

このケースでは非常に巨大なものですが、私はそれの短いバージョンを投稿します – cdie

答えて

0

あなたがLTCLTCLinksの間に2つの関係を持っていると私はEFが... LTC.Linksコレクションで使用を確認するかを知っているInverseProperty属性をdoen't推測する上で実行すると、次のようなものを持っている必要があります:

namespace ConsoleApp1 
{ 
    using Microsoft.EntityFrameworkCore; 

    public class Foo 
    { 
     public int Id { get; set; } 

     public string Name { get; set; } 
    } 

    public class Bar 
    { 
     public int Id { get; set; } 

     public int FooId { get; set; } 

     public virtual Foo Foo { get; set; } 
    } 

    public class MyDb : DbContext 
    { 
     public DbSet<Foo> Foos { get; } 

     public DbSet<Bar> Bars { get; } 

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
     { 
      optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=test; Trusted_Connection=True"); 
     } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Foo>(t => 
      { 
       t.HasKey(x => x.Id); 
      }); 

      modelBuilder.Entity<Bar>(t => 
      { 
       t.HasKey(x => x.Id); 
       t.Property(x => x.FooId).HasColumnName("FooIdColumn"); 
       t.HasOne(x => x.Foo).WithMany().HasForeignKey(x => x.FooId).HasConstraintName("MyFK"); 
      }); 
     } 
    } 
} 

あなたの元の質問について
[InverseProperty("Link2")] 
public IReadOnlyList<LTCLinks> Links {...} 

、ここで動作するコードですこれにより

project.jsonに:

"dependencies": { 
    "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.1" }, 
    "Microsoft.EntityFrameworkCore.Tools": { "type": "build", "version": "1.0.0-preview3-final" }, 
    "Microsoft.EntityFrameworkCore.Design": { "type": "build", "version": "1.1.0-preview1-final" }, 
    "Microsoft.EntityFrameworkCore.SqlServer": "1.1.0-preview1-final" 
    }, 

    "tools": { "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final" }, 

    "frameworks": { 
    "netcoreapp1.0": {} 
    } 

移行を生成し、実行した後、私はSQLを持っている:

enter image description here

+0

私のマッピングは素晴らしいです、私はそれらを私の質問に表示するよりも深く構成します。 最初は、私はCONSTRAINTの名前ではなく、COLUMNの名前を求めていました。最後の画像では、columnNameはMyFKではなくFooIdであることがわかります。 さらに、リフレクションによってすべてがセットアップされているため、私はDataAnnotationを使用できません。なぜFluent APIについて話していたのですか? – cdie

+0

おっと、ごめんなさい...私の答えは更新されました。 。属性がなくても、流暢なAPIだけです。また、EF '1.1.0-preview1'に更新されました。 – Dmitry

+0

リンクされているかどうか分かりませんが、質問の先頭を読んでいると、.Propertyを使用して列名を定義すると、関係を行うときにエラーが発生することがありました。また、ProperyメソッドのGenericバージョンを使用しています。私はリフレクションのためにそれを行うことができません(遅すぎます) – cdie

関連する問題