EF Code First 4.3 Самостоятельная ссылка на многие - PullRequest
0 голосов
/ 23 марта 2012

Я пытаюсь определить самосвязывающую связь для шага рабочего процесса, когда этот шаг недоступен для запуска, пока все его зависимые шаги не будут выполнены.Шаг может иметь ноль или много зависимостей.У меня есть следующее, но EF не отображает это правильно.Вместо этого он создает следующую таблицу, которая не соответствует моим потребностям.Как мне этого добиться?

Класс:

public class WorkflowStepDefinition : EntityBase, IAudited {
    [Key]
    public int WorkflowStepDefinitionId { get; set; }
    [MaxLength(100)]
    public string Name { get; set; }
    public string Description { get; set; }
    public int WorkflowDefinitionId { get; set; }        
    public virtual WorkflowDefinition WorkflowDefinition { get; set; }
    public virtual IList<WorkflowStep> WorkflowSteps { get; set; }
    public virtual IList<WorkflowStepDefinition> DependsOn { get; set; }
    public AuditDetails Audit { get; set; }        
}

Таблица Def:

CREATE TABLE [dbo].[WorkflowStepDefinitions](
    [WorkflowStepDefinitionId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Description] [nvarchar](max) NULL,
    [WorkflowDefinitionId] [int] NOT NULL,
    [Audit_CreatedBy] [nvarchar](max) NOT NULL,
    [Audit_DateCreated] [datetimeoffset](7) NOT NULL,
    [Audit_UpdatedBy] [nvarchar](max) NULL,
    [Audit_DateUpdated] [datetimeoffset](7) NULL,
    [WorkflowStepDefinition_WorkflowStepDefinitionId] [int] NULL,
 CONSTRAINT [PK_WorkflowStepDefinitions] PRIMARY KEY CLUSTERED 
(
    [WorkflowStepDefinitionId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WorkflowStepDefinitions]  WITH CHECK ADD  CONSTRAINT [FK_WorkflowStepDefinitions_WorkflowDefinitions_WorkflowDefinitionId] FOREIGN KEY([WorkflowDefinitionId])
REFERENCES [dbo].[WorkflowDefinitions] ([WorkflowDefinitionId])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[WorkflowStepDefinitions] CHECK CONSTRAINT [FK_WorkflowStepDefinitions_WorkflowDefinitions_WorkflowDefinitionId]
GO

ALTER TABLE [dbo].[WorkflowStepDefinitions]  WITH CHECK ADD  CONSTRAINT [FK_WorkflowStepDefinitions_WorkflowStepDefinitions_WorkflowStepDefinition_WorkflowStepDefinitionId] FOREIGN KEY([WorkflowStepDefinition_WorkflowStepDefinitionId])
REFERENCES [dbo].[WorkflowStepDefinitions] ([WorkflowStepDefinitionId])
GO

ALTER TABLE [dbo].[WorkflowStepDefinitions] CHECK CONSTRAINT [FK_WorkflowStepDefinitions_WorkflowStepDefinitions_WorkflowStepDefinition_WorkflowStepDefinitionId]
GO

Редактировать: В идеале я думаю, что я хотел бы что-то, что производит таблицу соединения, такие как:

CREATE TABLE [dbo].[WorkflowStepDefinitionDependencies](
    WorkflowStepDefinitionId int NOT NULL,
    DependencyId int NOT NULL
)

1 Ответ

2 голосов
/ 23 марта 2012

Как уже упоминалось в комментарии, вы можете достичь этого с помощью свободного API, который также дает вам возможность назвать вашу соединительную таблицу и FK в соединительной таблице:

modelBuilder.Entity<WorkflowStepDefinition>()
            .HasMany(w => w.DependsOn)
            .WithMany()
            .Map(mc =>
                {
                     mc.ToTable("WorkflowStepDefinitionDependencies", "dbo");
                     mc.MapLeftKey("WorkflowStepDefinitionId");
                     mc.MapRightKey("DependencyId");
                });
...