表关系中的不同关键

时间:2014-06-05 08:09:07

标签: c# entity-framework-6 database-first table-relationships

我有一个具有这种结构的数据库

TASKs              SubTasks
=============================
Id (pk)            Id (pk)
Name               Name
TaskCode           ParentTaskCode

现在我需要使用SubTasksTasks表连接到Tasks.TaskCode作为它们之间关系的关键,而实体框架不允许我这样做,任何想法:) ?

注意:我不拥有此数据库,因此无法对结构进行任何更改。

4 个答案:

答案 0 :(得分:0)

你可以尝试类似的东西。

public class Certificates
{
    [Key]
    public int CertID { get; set; }

    public Users User { get; set; }
    public Quiz Quiz { get; set; }
}

public class Users
{
    public int ID { get; set; }
    public ICollection<Certificates> Certificates { get; set; }
}

public class Quiz
{
    public int QuizID { get; set; }
    public ICollection<Certificates> Certificates { get; set; }
}

public class cpdContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entitiy<Users>()
            .HasMany(u => u.Certificates)
            .WithRequired(c => c.User)  // or WithOptional
            .Map(m => m.MapKey("UserID")); //<- DB FK column name

        modelBuilder.Entitiy<Quiz>()
            .HasMany(u => u.Certificates)
            .WithRequired(c => c.Quiz)  // or WithOptional
            .Map(m => m.MapKey("QuizID")); //<- DB FK column name
    }
}

此外,在独立关联中,外键(Association)在概念模型中定义。

要在概念模型中定义关联,我们必须添加关联集,关联和导航属性。

  1. 它在ObjectStateManager中表示为单独的对象。它有自己的EntityState!
  2. 在建立关联时,您始终需要来自协会两端的权利
  3. 此关联的映射方式与实体相同。
  4. Source

答案 1 :(得分:0)

可能有些东西我不明白......

为什么要将Task.TaskCode用作SubTasks的外键?

如果ID是任务的PK,那么在你参考时删除TaskCode使用Task.ID

SubTasks.TaskID ----&gt; Task.ID。

此外,还有一些关于命名约定的其他建议。

  • 不要复数表名
  • 使用“&lt;%table%&gt; ID”作为pk的名称:exemple TaskID for task。
  • 在你的子任务表中使用fk列作为fk:exemple“TaskID”的名称作为fk

答案 2 :(得分:0)

如果您正在使用MVC,那么您可以简单地为上面创建复合视图模型。

如果不改变EF,你可以做你想做的事。

将课程设为

public class CompositeTaskSubtask
{
    public <namespace>.<tasktablename> taskmodel { get; set; }
    public <namespace>.<subtasktablename> subtaskmodel { get; set; }
}

答案 3 :(得分:-1)

您可以尝试使用自己的主键添加名为SubTask的链接表。这样taskCode就不需要是主键。

CREATE TABLE Task
(
    taskId int IDENTITY (1, 1) NOT NULL,
    name nvarchar(50),
    taskCode nvarchar(50),
    CONSTRAINT Task_PK PRIMARY KEY(taskId)
)
GO


CREATE TABLE SubTask
(
    subTaskId int NOT NULL,
    taskId int NOT NULL,  -- must have a parent
    CONSTRAINT SubTask_PK PRIMARY KEY(subTaskId)
)
GO


ALTER TABLE SubTask ADD CONSTRAINT SubTask_FK1 FOREIGN KEY (taskId) REFERENCES [Task] (taskId) ON DELETE NO ACTION ON UPDATE NO ACTION
GO


ALTER TABLE SubTask ADD CONSTRAINT SubTask_FK2 FOREIGN KEY (subTaskId) REFERENCES [Task] (taskId) ON DELETE NO ACTION ON UPDATE NO ACTION
GO