C# 实体框架数据库第一个映射器问题

C# 实体框架数据库第一个映射器问题,c#,sql,entity-framework,database-first,C#,Sql,Entity Framework,Database First,我正在使用VS2010和SQL server 2008 R2 我是c#和实体框架的完全初学者 在下面的示例中,我遇到的问题是,当我试图获取与特定选项卡相关联的问题时,生成的SQL是不正确的。我想这与我在两个表上有一个Tab_ID外键这一事实有关,这两个表引用了相同名称的相同字段 但是,当我尝试获取与检查表关联的选项卡时,生成的SQL是正确的。我做的每件事都完全一样,但却产生了不同的结果 任何帮助都将不胜感激 下面我附上了使用的方法和输出,以及DB关系模型和我使用的映射器 与检查表关联的选项卡(按

我正在使用VS2010和SQL server 2008 R2

我是c#和实体框架的完全初学者

在下面的示例中,我遇到的问题是,当我试图获取与特定选项卡相关联的问题时,生成的SQL是不正确的。我想这与我在两个表上有一个Tab_ID外键这一事实有关,这两个表引用了相同名称的相同字段

但是,当我尝试获取与检查表关联的选项卡时,生成的SQL是正确的。我做的每件事都完全一样,但却产生了不同的结果

任何帮助都将不胜感激

下面我附上了使用的方法和输出,以及DB关系模型和我使用的映射器

与检查表关联的选项卡(按预期工作)

与选项卡相关的问题(不起作用)

我已创建以下数据库: (我还没有10张图片,但链接如下)

我已为表格设置了映射器,如下所示:

    class CheckSheetTabConfiguration : EntityTypeConfiguration<CheckSheetTab>
{
    public CheckSheetTabConfiguration() : base()
    {
        HasKey(x => x.Table_ID);

        Property(p => p.Tab_ID)
            .HasColumnName("Tab_ID");

        Property(p => p.CheckSheet_ID)
            .HasColumnName("CheckSheet_ID");

        Property(p => p.Order_ID)
            .HasColumnName("Order_ID");

        //add the foreign key constraint
        HasRequired(p => p.Tab)
            .WithMany()
            .HasForeignKey(x => x.Tab_ID);

        HasRequired(p => p.CheckSheet)
            .WithMany()
            .HasForeignKey(x => x.CheckSheet_ID);

        ToTable("tbl_CheckSheet_Tabs");
    }

}

class TabQuestionConfiguration : EntityTypeConfiguration<TabQuestion>
{
    public TabQuestionConfiguration()
        : base()
    {
        HasKey(x => x.Table_ID);

        Property(p => p.Tab_ID)
            .HasColumnName("Tab_ID");

        Property(p => p.Question_ID)
            .HasColumnName("Question_ID");

        Property(p => p.Order_ID)
            .HasColumnName("Order_ID");

        //add the foreign key constraint
        HasRequired(p => p.Question)
            .WithMany()
            .HasForeignKey(x => x.Question_ID);

        HasRequired(p => p.Tab)
            .WithMany()
            .HasForeignKey(x => x.Tab_ID);

        ToTable("tbl_Tab_Questions");
    }
}
public class CheckSheetTab
{
    public Int32 Table_ID { get; set; }
    public Int32 Tab_ID { get; set; }
    public Int32 CheckSheet_ID { get; set; }
    public Int32 Order_ID { get; set; }
    public virtual Tab Tab { get; set; }
    public virtual CheckSheet CheckSheet { get; set; }
}

public class TabQuestion
{
    public Int32 Table_ID { get; set; }
    public Int32 Question_ID { get; set; }
    public Int32 Tab_ID { get; set; }
    public Int32 Order_ID { get; set; }
    public virtual Question Question { get; set; }  
    public virtual Tab Tab { get; set; }  
}
*选项卡配置

class TabConfiguration : EntityTypeConfiguration<Tab>
{
    public TabConfiguration() : base()
    {
        HasKey(x => x.Tab_ID);

        Property(p => p.Tab_Desc)
            .HasColumnName("Tab_Desc");

        ToTable("tbl_Tabs");
    }
}
class QuestionConfiguration : EntityTypeConfiguration<Question>
{
    public QuestionConfiguration() : base()
    {
        HasKey(x => x.Question_ID);

        Property(p => p.Question_Desc)
            .HasColumnName("Question_Desc");

        Property(p => p.Parent_ID)
            .HasColumnName("Parent_ID");

        ToTable("tbl_Questions");
    }
}
class CheckSheetConfiguration : EntityTypeConfiguration<CheckSheet>
{
    public CheckSheetConfiguration() : base()
    {
        HasKey(x => x.CheckSheet_ID);

        Property(p => p.CheckSheet_Desc)
            .HasColumnName("CheckSheet_Desc");

        Property(p => p.Tab_Count)
            .HasColumnName("Tab_Count");

        ToTable("tbl_CheckSheets");
    }
}
类选项卡配置:EntityTypeConfiguration
{
公共选项卡配置():base()
{
HasKey(x=>x.Tab\u ID);
属性(p=>p.Tab\u Desc)
.HasColumnName(“Tab_Desc”);
ToTable(“待定标签”);
}
}
*问题配置

class TabConfiguration : EntityTypeConfiguration<Tab>
{
    public TabConfiguration() : base()
    {
        HasKey(x => x.Tab_ID);

        Property(p => p.Tab_Desc)
            .HasColumnName("Tab_Desc");

        ToTable("tbl_Tabs");
    }
}
class QuestionConfiguration : EntityTypeConfiguration<Question>
{
    public QuestionConfiguration() : base()
    {
        HasKey(x => x.Question_ID);

        Property(p => p.Question_Desc)
            .HasColumnName("Question_Desc");

        Property(p => p.Parent_ID)
            .HasColumnName("Parent_ID");

        ToTable("tbl_Questions");
    }
}
class CheckSheetConfiguration : EntityTypeConfiguration<CheckSheet>
{
    public CheckSheetConfiguration() : base()
    {
        HasKey(x => x.CheckSheet_ID);

        Property(p => p.CheckSheet_Desc)
            .HasColumnName("CheckSheet_Desc");

        Property(p => p.Tab_Count)
            .HasColumnName("Tab_Count");

        ToTable("tbl_CheckSheets");
    }
}
类问题配置:EntityTypeConfiguration
{
public QuestionConfiguration():base()
{
HasKey(x=>x.Question\u ID);
属性(p=>p.Question\u Desc)
.HasColumnName(“问题描述”);
属性(p=>p.Parent\u ID)
.HasColumnName(“家长ID”);
ToTable(“tbl_问题”);
}
}
*检查表配置

class TabConfiguration : EntityTypeConfiguration<Tab>
{
    public TabConfiguration() : base()
    {
        HasKey(x => x.Tab_ID);

        Property(p => p.Tab_Desc)
            .HasColumnName("Tab_Desc");

        ToTable("tbl_Tabs");
    }
}
class QuestionConfiguration : EntityTypeConfiguration<Question>
{
    public QuestionConfiguration() : base()
    {
        HasKey(x => x.Question_ID);

        Property(p => p.Question_Desc)
            .HasColumnName("Question_Desc");

        Property(p => p.Parent_ID)
            .HasColumnName("Parent_ID");

        ToTable("tbl_Questions");
    }
}
class CheckSheetConfiguration : EntityTypeConfiguration<CheckSheet>
{
    public CheckSheetConfiguration() : base()
    {
        HasKey(x => x.CheckSheet_ID);

        Property(p => p.CheckSheet_Desc)
            .HasColumnName("CheckSheet_Desc");

        Property(p => p.Tab_Count)
            .HasColumnName("Tab_Count");

        ToTable("tbl_CheckSheets");
    }
}
类检查表配置:EntityTypeConfiguration
{
公共CheckSheetConfiguration():base()
{
HasKey(x=>x.CheckSheet\u ID);
属性(p=>p.CheckSheet\u Desc)
.HasColumnName(“检查表描述”);
属性(p=>p.Tab\u计数)
.HasColumnName(“制表计数”);
ToTable(“tbl_检查表”);
}
}
基类

    public class CheckSheet
{
    public int CheckSheet_ID { get; set; }
    public String CheckSheet_Desc { get; set; }
    public int Tab_Count { get; set; }
    public List<Tab> tabs { get; set; }
}

public class Tab
{
    public int Tab_ID { get; set; }
    public string Tab_Desc { get; set; }
    public List<Question> questions { get; set; }
}

public class Question
{
    public int Question_ID { get; set; }
    public int Question_Desc { get; set; }
    public int Parent_ID { get; set; }
}
公共类检查表
{
公共int检查表_ID{get;set;}
公共字符串检查表\u Desc{get;set;}
公共int Tab_Count{get;set;}
公共列表选项卡{get;set;}
}
公共类选项卡
{
public int Tab_ID{get;set;}
公共字符串选项卡_Desc{get;set;}
公共列表问题{get;set;}
}
公开课问题
{
公共整数问题_ID{get;set;}
公共整数问题{get;set;}
public int Parent_ID{get;set;}
}

我已经找到了错误的原因,原因很简单,我试图将字符串填充为int,我的错误处理不符合要求,因此跳过了它而不是记录它,结果错误显示为错误生成的SQL

问题:

public class Question
{
    public int Question_ID { get; set; }
    public int Question_Desc { get; set; }
    public int Parent_ID { get; set; }
}
资源

public class Question
{
    public int Question_ID { get; set; }
    public string Question_Desc { get; set; }
    public int Parent_ID { get; set; }
}

生产上述不正确sql的方法已更新。请发布选项卡的定义和配置?在不同的表中有两个同名列是可以的。它似乎在努力满足您的where要求。看起来您的查询将请求所有数据,然后在客户端上对其进行过滤。您是否可以尝试一种更纯粹的Linq方法:
从tabQuestion返回tabQuestion include Question where tabQuestion.Tab\u ID=tabId order by order\u ID@Rob Epstein,添加了选项卡配置。@Fox先生,我对linq不是很精通,但我尝试了您上面概述的内容,VS告诉我它必须以select结束。