2017-11-02 11 views
2

私の目標は、単一のParentIdのParentTypeIdを取得することです。
私は検索を続けてバリアスアプローチを試しています
私はすべて私のクエリを返しますParentIdではなくParentTypeIdを返します。なぜLINQは他の列の値を返しますか?

public class Parent 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Index("ParentIdIndex", IsUnique = true)] 
    public int ParentId { get; set; } 

    public string ParentName {get; set;} 

    public virtual ParentType ParentType { get; set; } 
} 

public class ParentType 
{ 

    [Key, ForeignKey("Parent")] 
    public int ParentTypeId { get; set; } 

    public string ParentTypeName { get; set; } 

    public virtual Parent Parent { get; set; } 
} 

このSQLクエリは、正しい結果を返す:

私のモデルは、これらの2つのテーブルを有する

一列である
select 
ParentId, 
ParentType_ParentTypeId 
FROM [myDB].[dbo].[Parents] 
Where ParentId = 5 

:(ParentIdは= 5、ParentTypeId = 6)

しかし、C#メソッドでLINQクエリを使用すると、ParentIdの値が返されます。
ParentTypeIdの値ではありません。

 var query = (
        from t1 in db.Parents 
        where (t1.ParentId == ParentId) 
        select t1.ParentType.ParentTypeId 
        ).FirstOrDefault(); 

なぜですか?

+0

あなたのクエリのように簡単にParentTypeIdを得ることができますあなたが提供していないコードや使用しているデータの中にある可能性があります。 (検索されたParentIdを持つ複数の行) –

+2

*なぜですか?[Shared Primary Key Association](https://weblogs.asp.net/manavi/associations-in-ef-4-1-code- first- part-3-shared-primary-key-associations)、したがって 'ParentTypeId'は常に' ParentId'と同じです(少なくともあなたの設定に基づくEFの観点から)。 –

+2

さらに興味深いのは、なぜあなたのデータベースに 'ParentType_ParentTypeId'カラムがあるのでしょうか? – grek40

答えて

1

外部キーを間違って作成しました。

ParentTypeIdは、Parentの外部キーである必要があります。

プライマリテーブルはParentTypeである必要があります。

私の例を参照してください。

Parentクラス

public class Parent 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Index("ParentIdIndex", IsUnique = true)] 
    public int ParentId { get; set; } 

    public string ParentName { get; set; } 

    [ForeignKey("ParentType")] 
    public int ParentTypeId { get; set; } 

    public virtual ParentType ParentType{ get; set; } 
} 

ParentTypeクラス

public class ParentType 
{ 
    [Key] 
    public int ParentTypeId { get; set; } 

    public string ParentTypeName { get; set; } 

    public virtual IEnumerable<Parent> Parents { get; set; } 
} 

あなたはこの

var parentItem = (
       from t1 in db.Parents 
       where (t1.ParentId == 12345) 
       select t1 
       ).FirstOrDefault(); 
// parentItem.ParentTypeId 
+0

私たちはどこかに行っています。 IEnumerableが私のプロジェクトのICollectionであることを除いて、あなたの思考のほとんどすべてを適用しました。 (違いを知らない)。 新しいParentを挿入しようとすると、常に新しいParentTypeが取得されます。既存のParentTypeを新しいParentに挿入する方法はありますか? –

+2

挿入する前にparentObject.ParentTypeId = existingParentTypeIdを割り当ててください – TriV

関連する問題