0

Clientもともと、私は次のものだけで構成される基本を持っていました。

public class Client : Entity
{
    [Required]
    public string Name { get; set; }
}

私の は、通常のフィールドなどUserと一緒に次のものを持っています:NameClient

public class User : Entity
{
    [Required, MinLength(4), Display(Name = "Username")]
    public string Username { get; set; }
    [Required, MinLength(2), Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Required, MinLength(2), Display(Name = "Last Name")]
    public string LastName { get; set; }
    [Required, EmailAddress]
    public string Email { get; set; }
    ...
    [Required]
    public virtual Client Client { get; set; }
}

私のGet方法:

public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string[] includeProperties = null)
    {
        IQueryable<TEntity> query = dbSet;

        if (includeProperties != null)
            query = includeProperties.Aggregate(query, (q, s) => q.Include(s));

        query = query.Where(x => !x.Deleted);

        if (filter != null)
            query = query.Where(filter);

        return orderBy != null ? orderBy(query).ToList() : query.ToList();
    }

これはすべて問題ありませんでした。AccountManagerだから、問題に:それは実際には私のクライアントにありUserます。

public class Client : Entity
{
    [Required]
    public string Name { get; set; }

    [Required]
    public CompanyType CompanyType { get; set; }

    [Required]
    public ClientStatus Status { get; set; }

    [SomethingInHere?]
    public virtual User AccountManager { get; set; }

    public DateTime? AccessFrom { get; set; }
    public DateTime? AccessTo { get; set; }

    public DateTime? ClosedDate { get; set; }
}

sに「AccountManager」を追加し、INCLUDE_STRING最近GetでもさまざまなForeignKey/データ注釈を使用しようとしましたが、AccountManagerを一緒にRequired引き出すことができません。User

Userそれで、私がs をまったく引き出せなくなった理由全体ではないにしても、それが一部であると思います。

要するに、EF のリレーションシップ処理についての私の理解はいくぶん限定されており、今日の私の Google の能力はゼロに達していないようです。

多くUserの から a Client. 各1UserAccountManagerずつClient。なぜこれが私にとってとても難しいのですか?

編集:丸められた答え。

modelbuilder パーツに追加:

modelBuilder.Entity<User>()
            .HasRequired(x => x.Client)
            .WithMany(x => x.Users);

modelBuilder.Entity<Client>()
            .HasOptional(x => x.AccountManager);

を変更しClientて、ユーザーのリストを含めます。

public class Client : Entity
{
    [Required]
    public string Name { get; set; }

    [Required]
    public CompanyType CompanyType { get; set; }

    [Required]
    public ClientStatus Status { get; set; }

    public virtual IList<User> Users { get; set; }
    public virtual User AccountManager { get; set; }

    public DateTime? AccessFrom { get; set; }
    public DateTime? AccessTo { get; set; }

    public DateTime? ClosedDate { get; set; }
}

それが一緒になって、EFはそれをすべて適切に引き出すのに十分なほど幸せになりました.

4

2 に答える 2

0

これはより多くのコメントとして認められるかもしれませんが、そこに収まりきらないほどです...

  1. すべてのカスタム要素を脇に置いて、意図したとおりに EF を直接クエリしてみてください。これにより、少なくとも独自のコードとエンティティの設定方法の問題が除外されます (この限られたコード サンプルでは問題がどこにあるのかがわからないため、現時点では判断が困難です)。
  2. を使用するより良い方法 (IMO)Includeは、厳密に型指定されたバージョンを使用することですquery.Include(u => u.Client)。コードで実行時エラーが発生しにくくなります。
  3. 関連するプロパティを取り戻すのに失敗しているクエリを表示し、関連するすべてのエンティティ/プロパティを投稿します。EF 規則に一致する外部キー Id プロパティを含めていますか? これは EF Code First または EDMX モデルを使用していますか?

編集-このリンクは、関係の設定に役立つ場合があります。また、あなたのUserエンティティにClientIdプロパティがありません(およびClientがありませAccountManagerIdん)。「Navigation プロパティ」(Google 検索に含めたい用語) を取得するには、結合する外部キー プロパティを知る必要があります。

于 2013-09-03T13:22:08.723 に答える