导航属性不会退出

时间:2015-04-07 08:33:51

标签: c# entity-framework code-first

我正在使用C#和.NET Framework 4.5.1开发实体框架6.1.2 Code First库。

我收到此错误:

  

指定的包含路径无效。 EntityType   ' MyProject.Data.SqlServer.Concrete.AGGREGATION_CHILDS'才不是   声明一个名为' Code'。

的导航属性

请注意MyProject.Data.SqlServer.Concrete命名空间不正确。我在DbContext命名空间中声明了MyProject.Data.SqlServer.Concrete

这是AGGREGATION_CHILDS类声明:

namespace MyProject.Data
{
    public class AGGREGATION_CHILDS
    {
        public string CODE { get; set; }
        public string PARENT_CODE { get; set; }
        public int POSITION { get; set; }

        public virtual AGGREGATIONS Aggregation { get; set; }
        public virtual CODES Code { get; set; }
    }
}

CODES课程:

namespace MyProject.Data
{
    public class CODES
    {
        public string CODE { get; set; }
        public byte CODE_LEVEL { get; set; }
        [ ... ]

        public virtual AGGREGATION_CHILDS AggregationChild { get; set; }
    }
}

及其配置文件:

namespace MyProject.Data.SqlServer.Configurations
{
    class AGGREGATION_CHILDSConfiguration : EntityTypeConfiguration<AGGREGATION_CHILDS>
    {
        public AGGREGATION_CHILDSConfiguration()
        {
            HasKey(ag_ch => ag_ch.CODE);

            Property(ag_ch => ag_ch.CODE)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            Property(ag_ch => ag_ch.CODE)
                .HasMaxLength(20)
                .IsRequired();

            Property(ag_ch => ag_ch.PARENT_CODE)
                .HasMaxLength(20)
                .IsRequired();

            HasRequired(ag_ch => ag_ch.Aggregation)
                .WithMany(ag => ag.AggregationChilds)
                .HasForeignKey(ag_ch => ag_ch.PARENT_CODE);

            HasRequired(ag_ch => ag_ch.Code)
                .WithOptional(c => c.AggregationChild)
                .WillCascadeOnDelete(false);
        }
    }
}

另一个配置文件:

namespace MyProject.Data.SqlServer.Configurations
{
    class CODESConfiguration : EntityTypeConfiguration<CODES>
    {
        public CODESConfiguration()
        {
            HasKey(c => c.CODE);

            Property(c => c.CODE)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            Property(c => c.CODE)
                .HasMaxLength(20)
                .IsRequired();

            [ ... ]
        }
    }
}

这就是我收到错误的地方:

List<AGGREGATION_CHILDS> agChilds =
                m_AggChildRepo
                .SearchForWithInclude(agCH => agCH.PARENT_CODE == aggregation.PARENT_CODE, "Code")
                .ToList<AGGREGATION_CHILDS>();

SearchForWithInclude实施是:

public IQueryable<TEntity> SearchForWithInclude(
    Expression<Func<TEntity, bool>> predicate,
    string includePath)
{
    return _dbSet.Where(predicate).Include(includePath);
}

CODESAGGREGATION_CHILDS有一对一或零关系。

你知道为什么抱怨Code导航属性没有退出吗?也许,我还没有正确地建立零或一对一的关系。

2 个答案:

答案 0 :(得分:0)

触发错误的行评估为

m_AggChildRepo.Where(agCH => agCH.PARENT_CODE == aggregation.PARENT_CODE).Include("Code")

这包括应该做什么?即使您使用Dynamic Linq,“Code”应该是什么?您在此处发布的所有片段都使用完全大写的属性和属性名称。

答案 1 :(得分:0)

这是我如何解决问题的。我认为存在一个不明确的问题。

namespace MyProject.Data
{
    public class AGGREGATION_CHILDS
    {
        public string CHILD_CODE { get; set; }
        public string PARENT_CODE { get; set; }
        public int POSITION { get; set; }

        public virtual AGGREGATIONS Aggregation { get; set; }
        public virtual CODES Code { get; set; }
    }
}

我已使用AGGREGATION_CHILDS.CODE更改了AGGREGATION_CHILDS.CHILD_CODE属性。

namespace MyProject.Data.SqlServer.Configurations
{
    class AGGREGATION_CHILDSConfiguration : EntityTypeConfiguration<AGGREGATION_CHILDS>
    {
        public AGGREGATION_CHILDSConfiguration()
        {
            HasKey(ag_ch => ag_ch.CHILD_CODE);

            Property(ag_ch => ag_ch.CHILD_CODE)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            Property(ag_ch => ag_ch.CHILD_CODE)
                .HasMaxLength(20)
                .IsRequired()
                .HasColumnName("CODE");

            Property(ag_ch => ag_ch.PARENT_CODE)
                .HasMaxLength(20)
                .IsRequired();

            HasRequired(ag_ch => ag_ch.Aggregation)
                .WithMany(ag => ag.AggregationChilds)
                .HasForeignKey(ag_ch => ag_ch.PARENT_CODE);

            HasRequired(ag_ch => ag_ch.Code)
                .WithOptional(c => c.AggregationChild)
                .WillCascadeOnDelete(false);
        }
    }
}

并设置数据库中的列名:

Property(ag_ch => ag_ch.CHILD_CODE)
    .HasMaxLength(20)
    .IsRequired()
    .HasColumnName("CODE");