EFコアの流暢なAPIにForeignKey列名を設定する方法

c# entity-framework entity-framework-core

質問

私は私の外国キーの列に私が望む名前をつけようとしています。

私がbuilder.Propertyで私のforeignKeyを設定すると、別名

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

リレーションシップを作成するときに、次のようなエラーが発生します。「エンティティタイプ 'LettreCleAssociation'に同じ名前のプロパティが既に存在するため、ナビゲーションタイプ「LettreClePrincipale」をエンティティタイプ「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。

人気のある回答

あなたはLTCLTCLinks間に2つの関係がありLTCLinksそして、私はEFがLTC.Linksコレクションで使うものを知っていないと思います... InverseProperty属性を確認してください。

[InverseProperty("Link2")]
public IReadOnlyList<LTCLinks> Links {...}

あなたのオリジナルの質問については、ここで動作するコードです:

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

これを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で次のことを行います。

ここに画像の説明を入力



Related

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