Sql server 模型实体框架多加共享关系
在实体框架(模型优先)中,我实现了一个多-多(例如,合成选集)关系,以及一个必须在相关集合中匹配的附加关系(作曲家) 如何在EF中正确创建此模型? 我现在有两个坏主意: 坏主意#1 EF通过在合成和选集合成上制作主键(同时包含作曲家ID和本地身份),正确地约束了这一点。然而,这会造成直接的问题:Sql server 模型实体框架多加共享关系,sql-server,sql-server-2008,entity-framework,entity-framework-5,Sql Server,Sql Server 2008,Entity Framework,Entity Framework 5,在实体框架(模型优先)中,我实现了一个多-多(例如,合成选集)关系,以及一个必须在相关集合中匹配的附加关系(作曲家) 如何在EF中正确创建此模型? 我现在有两个坏主意: 坏主意#1 EF通过在合成和选集合成上制作主键(同时包含作曲家ID和本地身份),正确地约束了这一点。然而,这会造成直接的问题: 所有与作曲和选集相关的表格现在也有FKs的Composer ID;DBA很痛苦 我不能仅仅基于唯一标识等使用EF 5.0的EntitySet.Find() 坏主意#2 我可以在设计器中具体化Com
- 所有与作曲和选集相关的表格现在也有FKs的Composer ID;DBA很痛苦
- 我不能仅仅基于唯一标识等使用EF 5.0的EntitySet.Find()
- 中断EF数据库的创建/更新
- 中断实体导航/添加
编辑:我根据要求在这里发布了我的实际模型的一部分,希望我的目标可以用不同的示意图表示。(为了简洁起见,我删除了HashSet赋值。)从逻辑上讲,在这个模型中,合成代表参与,因为必须有一个相关的参与(具有匹配的帐户)才能存在背书
public partial class Account
{
public int Id { get; set; }
public string PrimaryEmail { get; set; }
public virtual ICollection<Endorsement> EndorsementsGiven { get; set; }
public virtual ICollection<Endorsement> EndorsementsReceived { get; set; }
public virtual ICollection<Engagement> Engagements { get; set; }
public virtual ICollection<EngagementEndorsement> EngagementEndorsements { get; set; }
}
public partial class EngagementEndorsement
{
public int Endorsement_Id { get; set; }
public int Engagement_Id { get; set; }
public int Account_Id { get; set; }
public virtual Endorsement Endorsement { get; set; }
public virtual Engagement Engagement { get; set; }
public virtual Account Account { get; set; }
}
public partial class Engagement
{
public int Id { get; set; }
public System.DateTime Start { get; set; }
public System.DateTime End { get; set; }
public string JobFunction { get; set; }
public virtual Account Account { get; set; }
public virtual ICollection<EngagementEndorsement> EngagementEndorsements { get; set; }
}
public partial class Endorsement
{
public int Id { get; set; }
public EndorsementStatus Status { get; set; }
public EndorserRole EndorserRole { get; set; }
public string Note { get; set; }
public virtual Account Endorsee { get; set; }
public virtual Account Endorser { get; set; }
public virtual ICollection<EngagementEndorsement> EngagementEndorsements { get; set; }
}
最后,基于两个相关问题中良好的数据模式反馈(以及缺乏EF反馈),我进行了很多工作,如上面的“坏主意2”所示 我一直在使用它,它满足了我当前的所有需求 有关实现的其他方面的更多详细信息,请参见以下内容:
- SQL约束:
- EF5导航:
-- --------------------------------------------------
-- Ensure Engagement-to-Endorsement AccountId match
-- --------------------------------------------------
ALTER TABLE [dbo].[Engagements]
ADD CONSTRAINT [UK_EngagementIdAccountId]
UNIQUE NONCLUSTERED
([Id], [Account_Id])
WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
ALTER TABLE [dbo].[EngagementEndorsements]
ADD CONSTRAINT [FK_EngagementIdAccountId]
FOREIGN KEY ([Engagement_Id], [Account_Id])
REFERENCES [dbo].[Engagements]
([Id], [Account_Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE [dbo].[Endorsements]
ADD CONSTRAINT [UK_EndorsementIdAccountId]
UNIQUE NONCLUSTERED
([Id], [Endorsee_Id])
WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
ALTER TABLE [dbo].[EngagementEndorsements]
ADD CONSTRAINT [FK_EndorsementIdAccountId]
FOREIGN KEY ([Endorsement_Id], [Account_Id])
REFERENCES [dbo].[Endorsements]
([Id], [Endorsee_Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO