Sql server 模型实体框架多加共享关系

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

在实体框架(模型优先)中,我实现了一个多-多(例如,合成选集)关系,以及一个必须在相关集合中匹配的附加关系(作曲家)

如何在EF中正确创建此模型?

我现在有两个坏主意:

坏主意#1

EF通过在合成和选集合成上制作主键(同时包含作曲家ID和本地身份),正确地约束了这一点。然而,这会造成直接的问题:

  • 所有与作曲和选集相关的表格现在也有FKs的Composer ID;DBA很痛苦
  • 我不能仅仅基于唯一标识等使用EF 5.0的EntitySet.Find()
坏主意#2

我可以在设计器中具体化CompositionAnthology透视表,向其中添加CompositeID,并直接向SQL添加约束。然而,这:

  • 中断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