2017-10-14 6 views
1

私はEntity Framework Code Firstを使用しており、わずかな問題が発生しました。GUIDのアクセスクラス

私のような二つのテーブルがあります。

User 
+--------+-----------+ 
| id | name | 
+--------+-----------+ 
| def789 | Bob Smith | 
+--------+-----------+ 

Actions 
+--------+--------------+-------------+ 
| id | grantedTo_id | details | 
+--------+--------------+-------------+ 
| abc123 | def789  | some detail | 
+--------+--------------+-------------+ 

は3つのIDフィールドは、この目的のためにGUIDがあるふり。

User 
{ 
public Guid id {get; set;} 
public string name {get; set;} 
} 

Actions 
{ 
public Guid id {get; set;} 
public User grantedTo {get; set;} 
public string details {get; set;} 
} 

私の問題は、クラスの型がユーザーとしてgrantedToを定義しているので(それはタイプのGUIDであるため)、何もデータベースからそれに返されないことである。

私のクラスには、次のようになり。

var action = db.Action.ToList() 
foreach (var a in db.Action) 
{ 
var user = a.GrantedTo 
} 

は、その後、ユーザがnull含まれています

だから例えば私のようなシンプルな何かをしている場合。

IDで参照されるユーザーを取得するにはどうすればよいですか?

これらは最初にコード化されていますが、私は変更を加えていません。ディスクリプタや使用するべきものがありますか?

var action = db.Action.ToList() 
foreach (var a in action) 
{ 
var user = db.Users.Find(...???) 
} 

しかし、私はGUIDが戻って来ないので、そこに置くべきではありません。

+2

あなたの 'Action'クラスは' public virtual User grantedTo {get; set;} 'と' public Guid UserId {get;セット; } 'ナビゲーションプロパティを作成するには - [Entity Frameworkのリレーションシップとナビゲーションプロパティ](https://msdn.microsoft.com/en-us/library/jj713564(v=113).aspx)を参照してください。 –

+0

@StephenMuecke OP 'public User grantedTo {get;}を持ちます。 set;} 'で十分です。 'virtual'も明示的なFKプロパティも* required *ではありません。 –

+1

'grantedTo'プロパティは' virtual'ではないので、レイジーに読み込むことはできず、あなたは熱心なロードや明示的なロードを使ってロードすることが期待されます。例えば、。 'var action = db.Action.Include(a => a.grantedTo).ToList();'は、リスト内のアクションの 'grantedTo'プロパティを設定します。 –

答えて

3

EFは、関連するデータ(eager loading、lazy loading、およびexplicit load)をロードする3つの方法をサポートしています(Entity Framework Loading Related Entities)。

プロパティはvirtualとマークされていないため、EFが関連するデータを自動的に読み込む3つの方法のうち、遅延読み込みには適していません。他の2つのEFでは、あなたの明示的な要求によってのみ、EFはそれを行います。例えば

Include方法(イーガーローディング)

var action = db.Action.Include(a => a.grantedTo).ToList(); 

を使用してリスト内のアクションのgrantedToプロパティを移入します。

これを行うもう1つの利点は、(現在)遅延ロードをサポートしていないEFコアと互換性があることです。

1

あなたがコードファーストを使用している場合は、あなたがあなたのアクションの定義を変更する必要があります:あなたは、あなたが定義したFKのプロパティを必要とせずに関係を設定するEntityTypeConfigurationを使用することができますEF6を使用している場合

public class Action 
{ 
    [Key] 
    public Guid ActionId { get; set; } 
    // ... 
    public Guid GrantedToId { get; set; } 
    [ForeignKey("GrantedToId")] 
    public virtual User GrantedTo { get; set; } 
    // ... 
} 

public class ActionConfiguration : EntityTypeConfiguration<Action> 
{ 
    public ActionConfiguration() 
    { 
    ToTable("Actions"); 
    HasKey(x => x.ActionId); 

    HasRequired(x => x.GrantedTo) 
     .WithMany() 
     .Map(x => x.MapKey("GrantedToId")) 
     .WillCascadeOnDelete(false); 
    } 
} 

私はEFでエンティティタイプの設定を使用することをお勧めします。これは、スキーマ初の開発を好むので、マッピングの設定方法をより詳細に制御できます。私は両方のパブリックセッターを持っているので、ナビゲーションプロパティとFKプロパティの両方を持つのが好きではありません。これは、FKを持っているかもしれないが、参照がロードされていない醜いシナリオのすべての種類を残します...またはFKフィールドが一致しない場合、または参照を更新せずにFKを設定する場合、