3

テーブル dbo.Users: UserId、UserName、E メール、...

テーブル dbo.Client: UserID、FirstName、LastName、...

モデル:

public class User
{
    public long UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public Client Client { get; set; }
    ...
}

public class Client
{
    public long UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}

私の DBContents には以下が含まれます。

public DbSet<User> Users { get; set; }
public DbSet<Client> Clients { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
                    .HasKey(x => x.UserId)
                    .HasRequired(x => x.Client).WithRequiredPrincipal();

    modelBuilder.Entity<Client>()
                    .HasKey(x => x.UserId)
                    .ToTable("Client");
}

その結果、null クライアントを持つユーザー モデルができました。しかし、同じ UserId で Client をフェッチすると、そのモデルが満たされていることがわかります。

どうしたの?

編集:

public virtual Client Client { get; set; }
4

2 に答える 2

3

ユーザーのクライアント プロパティを正しく定義しましたか。

public virtual Client UserClient { get; set; }

これを行うと、EF は動的プロキシを生成できます。つまり、実行時に User クラスをサブクラス化し、クライアント プロパティの遅延読み込みをサポートするコードを挿入します。Client プロパティは、要求されたときにのみ設定されますが、常にそこにあるかのように表示されます。これを確認するには、データ ソースをプロファイリングし、2 つの個別のクエリが出力されることを確認します。

DBContext サブクラスのコンストラクター内で、遅延読み込みがオンになっていることを確認することもできます。これがない場合、デフォルトで true になります。

Configuration.LazyLoadingEnabled = true;

これに失敗すると、どのように DBContext にアクセスしていますか?どのコードを実行していますか?

于 2013-09-24T08:43:01.807 に答える
2

もちろん、LazyLoadings を無効にして、自分で処理することをお勧めします。

Configuration.LazyLoadingEnabled = false;

そして、ユーザーをフェッチするときは、次のように書く必要があります:

context.Users.Include("UserClient").ToList();

また、正しいプロパティも必要です。

public virtual Client UserClient { get; set; }
于 2013-09-24T11:47:50.813 に答える