1

SQLiteでエンティティフレームワーク4.3を使用して、エンティティ間に多対多の関係を構築しています。ただし、実行時に、Group.ParametersコレクションとParameter.Groupsコレクションは、手動で追加するまで空です。

エンティティは次のとおりです。

public class Group
{
    public Group()
    {
        Parameters = new ObservableCollection<Parameter>();
    }
    public Int64 Id { get; set; }
    public string Name { get; set; }
    public ObservableCollection<Parameter> Parameters { get; set; }
}

public class Parameter
{
    public Parameter()
    {
        Groups = new ObservableCollection<Group>();
    }

    public Int64 Id { get; set; }
    public string Name { get; set; }
    public ObservableCollection<Group> Groups { get; set; }
}

OnModelCreatingの場合:

modelBuilder.Entity<Group>().HasMany(g => g.Parameters).WithMany(p => p.Groups).Map(c =>
{
    c.MapLeftKey("GroupId");
    c.MapRightKey("ParameterId");
    c.ToTable("Groups_has_Parameters");
});

テーブルを作成するためのSQL:

create table if not exists Parameters
(
    Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    Name TEXT NOT NULL
);

create table if not exists Groups
(
    Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    Name TEXT NOT NULL
);
create table if not exists Groups_has_Parameters
(
    GroupId INTEGER NOT NULL,
    ParameterId INTEGER NOT NULL,
    PRIMARY KEY (GroupId, ParameterId),

    FOREIGN KEY (GroupId) REFERENCES Groups(Id),
    FOREIGN KEY (ParameterId) REFERENCES Parameters(Id)
);
4

2 に答える 2

2

遅延読み込みを有効にするには、ナビゲーション プロパティを仮想にします。例えば:

public virtual ObservableCollection<Parameter> Parameters { get; set; } 

このようにして、EF は、最初にアクセスしたときにデータベースからコレクションを自動的に読み込みます。

それらを仮想化したくない、または遅延読み込みを行いたくない場合は、次のようなものを使用していつでもコレクションを明示的に読み込むことができます:

context.Entry(group).Collection(g => g.Parameters).Load();

または、Gaga が提案したように、Inlcude を使用してデータベースの最初のクエリを実行するときに、コレクションを積極的に読み込むことができます。

context.Groups.Include(g => g.Parameters);
于 2012-04-29T01:00:00.073 に答える
0

What you have should work ok (I'm not sure about the SqlLite provider specifics though),

Just add this to the query .Include(x=>x.Parameters) e.g.

db.Groups.Include(x=>x.Parameters)  

otherwise it's 'lazy'.

于 2012-04-29T00:22:38.830 に答える