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

Entity framework EntityFramework-数据库中的多对多引用,模型中没有反向引用,entity-framework,orm,entity-framework-5,entity-framework-mapping,Entity Framework,Orm,Entity Framework 5,Entity Framework Mapping,在我的应用程序中,用户可以定义参数,然后基于一组参数创建幻灯片集 我使用的是代码优先实体框架5.0,我有以下模型: class SlideSet { public ICollection<Parameter> Parameter } class Parameter {} 我知道我可以通过引入ParameterGroup实体或Param.SlideSets集合来对此进行建模,但它的存在仅用于ORM映射目的(并导致序列化问题)。是否有其他方法告诉EF从我的实体生成此表模型?这将使

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

我使用的是代码优先实体框架5.0,我有以下模型:

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


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

这将使您成为一个
参数
w/o导航属性:

modelBuilder.Entity<SlideSet>()
    .HasMany(x => x.Parameters)
    .WithRequired();
…和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
(例如,如果您想在那里添加其他字段),只需
参数
就可以指向它

谢谢,但是-有了这个db结构,一个幻灯片集可以有很多参数,但是一个参数最多只能被一个幻灯片集使用。在我的例子中,一个参数可以由零个或多个幻灯片集使用,一个幻灯片集可以有零个或多个参数。我只是不想让Parameter对象引用Slideset。它太晚了:)-我没有得到其他的观点-虽然很相似-我修改了它。哦,酷,我今天会试试这个,但这看起来像是我想要的,谢谢。我想你要找的是:我想你应该想当然地认为使用ORM的一些副作用。通过使集合不延迟加载,可以防止序列化问题。
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("");
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