2016-04-28 200 views
0

我正在使用實體框架核心1或「7.0.0-rc1-final」。我試圖做一個實體自我引用,但它不工作。按照exemplo:實體框架映射自引用

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
  • 我什麼也沒得到
  • 我收到一個異常,帶有mensage「附加信息:無效的列名稱'IdUnidade1'。 。

我真的不知道我做什麼

+0

您是否嘗試過使用腳手架命令生成代碼的第一個類和映射,或者它們是手動編寫的? –

回答

1

我已經試過無效的列UnidadePaiIdUnidade‘:無效的列名稱IdUnidadePai1'「

  • 我得到一個例外,mensage’的附加信息。 。生成數據庫表的代碼第一類,you'have張貼所以,這就是結果:

    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 
    

    當然,您必須根據您的數據庫設置更改連接字符串名稱。你可以閱讀詳細的解釋,你應該在這裏做什麼:Entity Framework 7 DbContext scaffold

  • +0

    謝謝你回答,但Unidade沒有IdUnidadePai但是是orthers的父親,這是行不通的。 Exemplo new Unidade(){IdUnidade = 1,IdUnidadePai = null};新的Unidade(){IdUnidade = 2,IdUnidadePai = 1} ..當我通過IdUnidade = 1進行搜索時,它應該帶一個元素的InverseIdUnidadePanNavigation。 –