我有一个具有这种结构的数据库
TASKs SubTasks
=============================
Id (pk) Id (pk)
Name Name
TaskCode ParentTaskCode
现在我需要使用SubTasks
将Tasks
表连接到Tasks.TaskCode
作为它们之间关系的关键,而实体框架不允许我这样做,任何想法:) ?
注意:我不拥有此数据库,因此无法对结构进行任何更改。
答案 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 :(得分:0)
可能有些东西我不明白......
为什么要将Task.TaskCode用作SubTasks的外键?
如果ID是任务的PK,那么在你参考时删除TaskCode使用Task.ID
SubTasks.TaskID ----&gt; Task.ID。
此外,还有一些关于命名约定的其他建议。
答案 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