2016-04-28 177 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。 –