Entity Frameworkマッピング自己参照

c# entity-framework entity-framework-core linq mapping

質問

私はEntity Framework Core 1 ou "7.0.0-rc1-final"を使用しています。エンティティの自己参照をしようとしていますが、それは動作しません。例を続けてください:

public class Unidade
{
    [Key]
    public Int32 IdUnidade { get; set; }
    public Int32? IdUnidadePai { get; set; }
    public String Nome { get; set; }
    public ICollection<Unidade> LstFilhos { get; set; }
    public Unidade UnidadePai { get; set; }
}

マッピングに従ってください:

public UnidadeConfiguration(EntityTypeBuilder<Unidade> paramModelBuilder)
{
    paramModelBuilder.HasKey(x => x.IdUnidade);

    paramModelBuilder.HasMany(x => x.LstFilhos)
            .WithOne(x => x.UnidadePai)
            .HasForeignKey(c => c.IdUnidadePai);

    paramModelBuilder.ToTable("Unidade","Unidade");
}

私はすでにこれを試してみました:

    paramModelBuilder.HasOne(x => x.UnidadePai)
            .WithMany(x => x.LstFilhos)
            .HasForeignKey(x => x.IdUnidade);

これを試してみてください:

paramModelBuilder.HasMany(x => x.LstFilhos)
            .WithOne(x => x.UnidadePai)
            .HasForeignKey("IdUnidade", "IdUnidadePai");

私のデータベースsql:

CREATE TABLE [Unidade].[Unidade](
    [IdUnidade] [int] IDENTITY(1,1) NOT NULL,
    [IdUnidadePai] [int] NULL,
    [Nome] [varchar](100) NOT NULL,
    CONSTRAINT [PK_Unidade] PRIMARY KEY CLUSTERED 
    (
        [IdUnidade] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING ON
GO

ALTER TABLE [Unidade].[Unidade]  WITH CHECK ADD CONSTRAINT [FK_Unidade_Unidade]
    FOREIGN KEY([IdUnidadePai])
REFERENCES [Unidade].[Unidade] ([IdUnidade])
GO

ALTER TABLE [Unidade].[Unidade] CHECK CONSTRAINT [FK_Unidade_Unidade]
GO

だから、ある要素を要素にしようとすると、いくつかのシナリオがあります:

  • 私は永遠のループを得て、常にid 1のように常に検索する
  • 私は何も得ない
  • 私は例外が発生し、メンズ "追加情報:無効な列名 'IdUnidade1'。無効な列名 'IdUnidadePai1'。"
  • mensageで例外が発生する "追加情報:無効な列UnidadePaiIdUnidade"

私は本当に私が何をしているのか分かりません。

人気のある回答

私は、データベーステーブルのコードファーストクラスを生成しようとしました。だから、それは結果です:

    public partial class Unidade
    {
        public int IdUnidade { get; set; }
        public int? IdUnidadePai { get; set; }
        public string Nome { get; set; }

        public virtual Unidade IdUnidadePaiNavigation { get; set; }
        public virtual ICollection<Unidade> InverseIdUnidadePaiNavigation { get; set; }
     }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Unidade>(entity =>
        {
            entity.HasKey(e => e.IdUnidade);

            entity.Property(e => e.Nome)
                .IsRequired()
                .HasMaxLength(100)
                .HasColumnType("varchar");

            entity.HasOne(d => d.IdUnidadePaiNavigation).WithMany(p => p.InverseIdUnidadePaiNavigation).HasForeignKey(d => d.IdUnidadePai);
        });
    }

これらを自己生成しようとするなら、私は次のコマンドを使用しました:

dnx ef dbcontext scaffold "Data Source=.;Initial Catalog=Unidade;Integrated Security=True;MultipleActiveResultSets=True" EntityFramework.MicrosoftSqlServer

もちろん、db設定に従って接続文字列名を変更する必要があります。ここで何をすべきかの詳細な説明を読むことができます: Entity Framework 7 DbContext足場



Related

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