2

SQL Server 2008 R2 で VS2010 を使用しています。

私は、c# と Entity Framework の両方の完全な初心者です。

以下の例で私が抱えている問題は、特定のタブに関連付けられた質問を取得しようとすると、生成された SQL が正しくないことです。同じ名前の同じフィールドを参照する2つのテーブルにTab_ID外部キーがあるという事実と関係があると思いますか?

ただし、チェックシートに関連付けられたタブを取得しようとすると、生成された SQL は正しいです。私はすべてまったく同じことをしましたが、異なる結果が得られましたか?

どんな助けでも大歓迎です。

以下に、使用したメソッドと出力、および使用した DB リレーションシップ モデルとマッパーを添付します。

CheckSheets に関連付けられたタブ (期待どおりに動作)

    public IQueryable<CheckSheetTab> getTabs(int checkSheetId)
    {
        //includes the foreign key information when returning Tab
        var allReturnInfo = CheckSheetTab.Include(x => x.Tab);
        var result = allReturnInfo.Where(p => p.CheckSheet_ID == checkSheetId);
        result = result.OrderBy(x => x.Order_ID);
        return result;
    }

SQL が生成されました

    {SELECT 
[Extent1].[Table_ID] AS [Table_ID], 
[Extent1].[Tab_ID] AS [Tab_ID], 
[Extent1].[CheckSheet_ID] AS [CheckSheet_ID], 
[Extent1].[Order_ID] AS [Order_ID], 
[Extent2].[Tab_ID] AS [Tab_ID1], 
[Extent2].[Tab_Desc] AS [Tab_Desc]
FROM  [dbo].[tbl_CheckSheet_Tabs] AS [Extent1]
INNER JOIN [dbo].[tbl_Tabs] AS [Extent2] ON [Extent1].[Tab_ID] = [Extent2].[Tab_ID]}

タブに関連する質問 (機能しません)

        public IQueryable<TabQuestion> getQuestions(int tabId)
    {
        //includes the foreign key information when returning Tab
        var allReturnInfo = TabQuestion.Include(x => x.Question);
        // NOTE FOR SOME REASON THIS IS NOT CREATING THE CORRECT SQL!!!!!!!!!
        var result = allReturnInfo.Where(p => p.Tab_ID == tabId);
        result = result.OrderBy(x => x.Order_ID);
        return result;
    }

SQL PRODUCED - EXTENT 3 が問題であり、なぜそれが生成されるのかわかりません。

{SELECT 
[Extent1].[Table_ID] AS [Table_ID], 
[Extent1].[Question_ID] AS [Question_ID], 
[Extent1].[Tab_ID] AS [Tab_ID], 
[Extent1].[Order_ID] AS [Order_ID], 
[Extent2].[Question_ID] AS [Question_ID1], 
[Extent2].[Question_Desc] AS [Question_Desc], 
[Extent2].[Parent_ID] AS [Parent_ID], 
[Extent3].[Tab_Tab_ID] AS [Tab_Tab_ID]
FROM   [dbo].[tbl_Tab_Questions] AS [Extent1]
INNER JOIN [dbo].[tbl_Questions] AS [Extent2] ON [Extent1].[Question_ID] = [Extent2].[Question_ID]
LEFT OUTER JOIN [dbo].[tbl_Questions] AS [Extent3] ON [Extent1].[Question_ID] = [Extent3].[Question_ID]}

次のデータベースを作成しました: (画像を投稿する評判はまだ 10 ありませんが、リンクは以下にあります) http://imgur.com/3Jchhlb

次のようにテーブル用にマッパーを設定しました。

    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");
    }
}

基本クラス

    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; }
}
4

1 に答える 1

0

エラーの原因を見つけました。これは非常に単純なもので、文字列を 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; }
}
于 2013-02-18T15:55:57.170 に答える