EF4.3 + sqlite多对多关系

时间:2012-04-28 19:47:02

标签: .net entity-framework sqlite many-to-many

我正在使用实体框架4.3 SQLite 在实体之间建立多对多关系。但是在运行时,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)
);

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

你有什么应该工作正常(虽然我不确定Sqlite提供商的具体细节),

只需将其添加到查询.Include(x=>x.Parameters),例如

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

否则就是'懒惰'。