与 EF4 和 Code First 的多对多关系

发布于 2024-10-10 00:58:59 字数 3669 浏览 1 评论 0原文

我有一个问题,我不知道如何用 Code First 的 CTP5 和 EF4 来表达。

编辑:在底部添加了我想通过 CF 复制的旧模式

这是我的具体场景:

团队是一个抽象概念;它应该与特定部门、特定赛季的一组特定球员一起存在。

NFL 的具体例子:

  • 1996 年(赛季)AFC 中部(分区)休斯顿油人队(球队)
  • 1997 年(赛季)AFC 中部(分区)田纳西油人队(球队)
  • 1999 年(赛季)AFC 中部(分区)田纳西泰坦队(球队)
  • 2002 (赛季) AFC South (分区) 田纳西泰坦队 (球队)

这些都是同一支球队。我希望能够执行以下操作:

// Titans team id = 17
var myTeam = myContext.Teams.Single(t => t.Id == 17)

// display players
foreach (var p in myTeam.Seasons[1999].Players)
{
    // Do something with the p here
}

// Display current division
Response.Write(myTeam.Seasons[2002].Division.Name);

我不确定 myTeam.Seasons 的 ICollection 成员变量中的特定查询语法,但概念应该是相同的。

谁能解释一下您如何通过 EF4 CF CTP5 中的 CF 表达这个概念? 您将如何通过 Code First 表达这一点?

当前 SQL 表

CREATE TABLE dbo.Season
(
    Id                INT IDENTITY(1,1)      NOT NULL,
    LeagueId          INT                    NOT NULL,
    [Name]            NVARCHAR(50)           NOT NULL,
    [Year]            CHAR(4)                NOT NULL,
    PrevSeasonId      INT            NULL

) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Season WITH NOCHECK ADD 
    CONSTRAINT PK_Season PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

CREATE TABLE dbo.Division
(
    Id       INT IDENTITY(1,1)      NOT NULL,
    DefaultName   NVARCHAR(50)           NOT NULL
) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Division WITH NOCHECK ADD 
    CONSTRAINT PK_Division PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

// Key Relation Table
CREATE TABLE dbo.DivisionsInSeason
(
    DivisionId     INT                  NOT NULL,
    SeasonId       INT                  NOT NULL,
    DefaultName    NVARCHAR(50)         NOT NULL,
    Commissioner   UNIQUEIDENTIFIER     NOT NULL,
    ParentDivId    INT              NULL
) ON [PRIMARY];

// Primary Key
ALTER TABLE dbo.DivisionsInSeason WITH NOCHECK ADD  
    CONSTRAINT PK_DivisionsInSeason PRIMARY KEY NONCLUSTERED (DivisionId, SeasonId) ON [PRIMARY] ;

// Foreign Keys    
ALTER TABLE dbo.DivisionsInSeason WITH CHECK ADD 
    CONSTRAINT FK_DivisionsInSeason_Division FOREIGN KEY(DivisionId) REFERENCES dbo.Division(Id),
    CONSTRAINT FK_DivisionsInSeason_Season FOREIGN KEY(SeasonId) REFERENCES dbo.Season(Id),
    CONSTRAINT FK_DivisionsInSeason_User FOREIGN KEY(Commissioner) REFERENCES dbo.[User](Id);

CREATE TABLE dbo.Team
(
    Id       INT IDENTITY(1,1)      NOT NULL,
    DefaultName     NVARCHAR(50)           NOT NULL,
    DefShortName       NCHAR(3)            NULL
) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Team WITH NOCHECK ADD 
    CONSTRAINT PK_Team PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY] ;

// Key relationship table
CREATE TABLE dbo.TeamsInDivision
(
    TeamId         INT              NOT NULL,
    DivisionId     INT              NOT NULL,
    SeasonId       INT              NOT NULL,
    GeneralManager UNIQUEIDENTIFIER NOT NULL,
    Name           NVARCHAR(50)     NOT NULL,
    ShortName      NCHAR(3)         NULL

) ON [PRIMARY];

// Check Constraints
ALTER TABLE dbo.TeamsInDivision ADD  
    CONSTRAINT PK_TeamsInDivision PRIMARY KEY NONCLUSTERED (TeamId, DivisionId, SeasonId) ON [PRIMARY];

// Foreign Keys    
ALTER TABLE dbo.TeamsInDivision WITH CHECK ADD 
    CONSTRAINT FK_TeamsInDivision_Team FOREIGN KEY(TeamId) REFERENCES dbo.Team(Id),
    CONSTRAINT FK_TeamsInDivision_Division FOREIGN KEY(DivisionId) REFERENCES dbo.Division(Id),
    CONSTRAINT FK_TeamsInDivision_Season FOREIGN KEY(SeasonId) REFERENCES dbo.Season(Id),
    CONSTRAINT FK_TeamsInDivision_User FOREIGN KEY(GeneralManager) REFERENCES dbo.[User](Id);

I've got a problem I can't figure out how to express with CTP5 of Code First and EF4.

EDIT: Added my old schema at the bottom that I'd like to replicate through CF

Here's my specific scenario:

A Team is an abstract concept; it should exist with a specific set of players, in a specific division, in a specific season.

A concrete example of this in action from the NFL:

  • 1996 (season) AFC Central (division) Houston Oilers (team)
  • 1997 (season) AFC Central (division) Tennessee Oilers (team)
  • 1999 (season) AFC Central (division) Tennessee Titans (team)
  • 2002 (season) AFC South (division) Tennessee Titans (team)

These are all the same team. I want to be able to do the following:

// Titans team id = 17
var myTeam = myContext.Teams.Single(t => t.Id == 17)

// display players
foreach (var p in myTeam.Seasons[1999].Players)
{
    // Do something with the p here
}

// Display current division
Response.Write(myTeam.Seasons[2002].Division.Name);

I'm not sure of the specific query syntax within an ICollection member variable of myTeam.Seasons, but the concept should be the same none the less.

Can anyone shed some light on how you'd express this concept through CF in EF4 CF CTP5?
How would you express this through Code First?

Current SQL tables

CREATE TABLE dbo.Season
(
    Id                INT IDENTITY(1,1)      NOT NULL,
    LeagueId          INT                    NOT NULL,
    [Name]            NVARCHAR(50)           NOT NULL,
    [Year]            CHAR(4)                NOT NULL,
    PrevSeasonId      INT            NULL

) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Season WITH NOCHECK ADD 
    CONSTRAINT PK_Season PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

CREATE TABLE dbo.Division
(
    Id       INT IDENTITY(1,1)      NOT NULL,
    DefaultName   NVARCHAR(50)           NOT NULL
) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Division WITH NOCHECK ADD 
    CONSTRAINT PK_Division PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

// Key Relation Table
CREATE TABLE dbo.DivisionsInSeason
(
    DivisionId     INT                  NOT NULL,
    SeasonId       INT                  NOT NULL,
    DefaultName    NVARCHAR(50)         NOT NULL,
    Commissioner   UNIQUEIDENTIFIER     NOT NULL,
    ParentDivId    INT              NULL
) ON [PRIMARY];

// Primary Key
ALTER TABLE dbo.DivisionsInSeason WITH NOCHECK ADD  
    CONSTRAINT PK_DivisionsInSeason PRIMARY KEY NONCLUSTERED (DivisionId, SeasonId) ON [PRIMARY] ;

// Foreign Keys    
ALTER TABLE dbo.DivisionsInSeason WITH CHECK ADD 
    CONSTRAINT FK_DivisionsInSeason_Division FOREIGN KEY(DivisionId) REFERENCES dbo.Division(Id),
    CONSTRAINT FK_DivisionsInSeason_Season FOREIGN KEY(SeasonId) REFERENCES dbo.Season(Id),
    CONSTRAINT FK_DivisionsInSeason_User FOREIGN KEY(Commissioner) REFERENCES dbo.[User](Id);

CREATE TABLE dbo.Team
(
    Id       INT IDENTITY(1,1)      NOT NULL,
    DefaultName     NVARCHAR(50)           NOT NULL,
    DefShortName       NCHAR(3)            NULL
) ON [PRIMARY];

// Primary key
ALTER TABLE dbo.Team WITH NOCHECK ADD 
    CONSTRAINT PK_Team PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY] ;

// Key relationship table
CREATE TABLE dbo.TeamsInDivision
(
    TeamId         INT              NOT NULL,
    DivisionId     INT              NOT NULL,
    SeasonId       INT              NOT NULL,
    GeneralManager UNIQUEIDENTIFIER NOT NULL,
    Name           NVARCHAR(50)     NOT NULL,
    ShortName      NCHAR(3)         NULL

) ON [PRIMARY];

// Check Constraints
ALTER TABLE dbo.TeamsInDivision ADD  
    CONSTRAINT PK_TeamsInDivision PRIMARY KEY NONCLUSTERED (TeamId, DivisionId, SeasonId) ON [PRIMARY];

// Foreign Keys    
ALTER TABLE dbo.TeamsInDivision WITH CHECK ADD 
    CONSTRAINT FK_TeamsInDivision_Team FOREIGN KEY(TeamId) REFERENCES dbo.Team(Id),
    CONSTRAINT FK_TeamsInDivision_Division FOREIGN KEY(DivisionId) REFERENCES dbo.Division(Id),
    CONSTRAINT FK_TeamsInDivision_Season FOREIGN KEY(SeasonId) REFERENCES dbo.Season(Id),
    CONSTRAINT FK_TeamsInDivision_User FOREIGN KEY(GeneralManager) REFERENCES dbo.[User](Id);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文