3

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

我正在使用代码优先实体框架 5.0,并且我有以下模型:

slideset 引用了几个参数

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

一个参数可能被许多幻灯片使用或根本不使用。但是,在我的域中,参数不需要引用 SlideSet,它们位于单独的有界上下文中(SlideSet 和 Parameter 都是聚合根)。因此,我不想从 Parameter 引用 SlideSet。

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

Table SlideSet
Table Param
Table SlideSetParam
   FK_SlideSet
   FK_Param

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

4

1 回答 1

3

这应该使您成为Parameterw/oa 导航属性:

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指向它即可。

于 2013-03-31T02:48:03.093 回答