EntityFramework - 数据库中的多对多引用,模型中没有反向引用

时间:2013-03-31 02:27:30

标签: entity-framework orm entity-framework-5 entity-framework-mapping

在我的应用程序中,用户可以定义参数,然后根据一组参数创建幻灯片集。

我使用的是代码优先的Entity Framework 5.0,我有以下模型:

slideset references several parameters

class SlideSet {
  public ICollection<Parameter> Parameter
}
class Parameter {}

许多幻灯片组可能使用参数,或者根本不使用任何参数。但是,在我的域中,参数不需要引用SlideSet,它们位于单独的有界上下文中(SlideSet和Parameter都是Aggregate Roots)。因此,我不想将参数从Parameter设置为SlideSet。

我想要的表模型(我不关心表/列名称)是

Table SlideSet
Table Param
Table SlideSetParam
   FK_SlideSet
   FK_Param

我知道我可以通过引入ParameterGroup实体或Param.SlideSets集合对此进行建模,但它仅用于ORM映射目的(并导致序列化问题)。有没有其他方法告诉EF从我的实体生成这个表模型?

1 个答案:

答案 0 :(得分:3)

这应该会使你成为Parameter导航属性:

modelBuilder.Entity<SlideSet>()
    .HasMany(x => x.Parameters)
    .WithRequired();

编辑:

根据评论 - 这应该是相似的。这似乎很适合你正在尝试做的事情....

modelBuilder.Entity<SlideSet>()
    .HasMany(x => x.Parameters)
    .WithMany();

...你可以使用它:

var slideset = new SlideSet { Parameters = new []
    {
        new Parameter{},
        new Parameter{},
        new Parameter{},
        new Parameter{},
    }
};
var slideset2 = new SlideSet { };
db.SlideSets.Add(slideset);
db.SaveChanges();

var slidesets = db.SlideSets.ToList();
var parameters = db.Parameters.ToList();
Console.WriteLine("");

db.SlideSets.Add(slideset2);
db.SaveChanges();

slidesets = db.SlideSets.ToList();
parameters = db.Parameters.ToList();
Console.WriteLine("");

...和SQL:

CREATE TABLE [dbo].[Parameters] (
    [ParameterID] [int] NOT NULL IDENTITY,
    CONSTRAINT [PK_dbo.Parameters] PRIMARY KEY ([ParameterID])
)
CREATE TABLE [dbo].[SlideSets] (
    [SlideSetID] [int] NOT NULL IDENTITY,
    CONSTRAINT [PK_dbo.SlideSets] PRIMARY KEY ([SlideSetID])
)
CREATE TABLE [dbo].[SlideSetParameters] (
    [SlideSet_SlideSetID] [int] NOT NULL,
    [Parameter_ParameterID] [int] NOT NULL,
    CONSTRAINT [PK_dbo.SlideSetParameters] PRIMARY KEY ([SlideSet_SlideSetID], [Parameter_ParameterID])
)
CREATE INDEX [IX_SlideSet_SlideSetID] ON [dbo].[SlideSetParameters]([SlideSet_SlideSetID])
CREATE INDEX [IX_Parameter_ParameterID] ON [dbo].[SlideSetParameters]([Parameter_ParameterID])
ALTER TABLE [dbo].[SlideSetParameters] ADD CONSTRAINT [FK_dbo.SlideSetParameters_dbo.SlideSets_SlideSet_SlideSetID] FOREIGN KEY ([SlideSet_SlideSetID]) REFERENCES [dbo].[SlideSets] ([SlideSetID]) ON DELETE CASCADE
ALTER TABLE [dbo].[SlideSetParameters] ADD CONSTRAINT [FK_dbo.SlideSetParameters_dbo.Parameters_Parameter_ParameterID] FOREIGN KEY ([Parameter_ParameterID]) REFERENCES [dbo].[Parameters] ([ParameterID]) ON DELETE CASCADE

...这使得原始表几乎与关系(many-to-many)“不可知” - 而索引表是在后台自动生成的。

你还可以进一步自定义它并制作自己的SlideSetParam(例如,如果你想在那里添加其他字段),几乎相同的布局 - 只需Parameters就必须指向代替。