4

私はこれらの3つのテーブルと典型的な多対多の関係を持っています

[Post] (
  [PostId] int, (PK)
  [Content] nvarchar(max)
   ...
)

[Tag] (
  [TagId] int, (PK)
  [Name] nvarchar
  ...
)

[TagPost] (
  [TagId] int, (PK, FK)
  [PostId] int (PK, FK)
)

そして、TagIdとPostIdは、それに応じてテーブルに設定されたPKとFKなどです。次に、これらのクラスとマッピングをc#で実行します。

public class Post {
    public Post()
    {
        this.Tags = new HashSet<Tag>();
    }

    [Key]
    public int PostId { get; set; }
    ...

    public virtual ICollection<Tag> Tags { get; private set; }
}

public class Tag {
    public Tag()
    {
        this.Posts = new HashSet<Post>();
    }

    [Key]
    public int TagId { get; set; }
    ...

    public virtual ICollection<Post> Posts { get; private set; }
}

internal class MyDbContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Post>().ToTable("Post");
        modelBuilder.Entity<Tag>().ToTable("Tag");

        modelBuilder.Entity<Post>()
            .HasMany(x => x.Tags)
            .WithMany(x => x.Posts)
        .Map(x =>
        {
            x.ToTable("TagPost");
            x.MapLeftKey("PostId");
            x.MapRightKey("TagId");
        });
    }

それから私はそれらを照会するためにこのコードを持っています

var list = (from p in ctx.Posts.Include(p => p.Tags)
            from t in p.Tags
            where ... // some of my filter conditions
            select p).ToList();

この結合は私が探していた投稿を返しますが、そこにインクルードがある場合でも、返された投稿には関連するタグが入力されません。誰かが私が欠けているものを指摘して、タグも投稿とともに返されるようにするのを手伝ってもらえますか?

どうもありがとう。

4

2 に答える 2

3

ダブルは、ここここで述べたように無視されるようにするfromマニュアルです。グループ化や射影などの他のLINQメソッドでも無視されます。JoinIncludeInclude

関係の修正は、通常、多対多の関係では機能せず、一方の端(1対多または1対1)に少なくとも1つの単一の参照がある関係に対してのみ機能します。Postsおよび関連を別のタイプ(匿名または名前付き)に投影するとTags、データは正しくロードされますが、関係が多対多であるため、EFはメモリ内に関係を自動的に作成せず、post.Tagsコレクションは空のままになります。

動作させるには、クエリからInclude2番目を削除し、次のように句をエンティティパラメータに直接適用する必要があります。fromwherePost

var list = (from p in ctx.Posts.Include(p => p.Tags)
            where p.Tags.Any(t => t.TagId == 1)
            select p).ToList();

プロパティによるフィルターは、パラメーターとして( )を持つ式であるTag渡された式で指定されます。.AnyTagt

于 2013-03-22T18:04:11.513 に答える
0

すべてを匿名オブジェクトに選択してみてください(このようなもの)

var list = (
        from p in ctx.Posts
        from t in p.Tags
        where ... // some of my filter conditions
        select new {
            Posts = p,
            Tags = p.Tags
        })
    .ToList();

私の最初の回答へのフィードバックと、EFは関連するエンティティを見つけることができるが、Tagsコレクションにデータを入力できないという事実に基づいて、問題はPostクラスのTagsエンティティの定義にあると思います。

Hashset<>コンストラクターとprivateset宣言から初期化子を削除してみてください。

public virtual ICollection<Tag> Tags { get; set; }
于 2013-03-21T19:29:48.330 に答える