在我的应用程序中,用户可以定义参数,然后根据一组参数创建幻灯片集。
我使用的是代码优先的Entity Framework 5.0,我有以下模型:
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从我的实体生成这个表模型?
答案 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
就必须指向代替。