C# 表关系中的不同键
我有一个这样结构的数据库C# 表关系中的不同键,c#,entity-framework-6,database-first,table-relationships,C#,Entity Framework 6,Database First,Table Relationships,我有一个这样结构的数据库 TASKs SubTasks ============================= Id (pk) Id (pk) Name Name TaskCode ParentTaskCode 现在我需要使用任务将子任务表连接到任务。任务代码作为它们之间关系的键,实体框架不允许我这样做,有什么想法吗:) 注意:我没有此数据库,因此无法对结构进行任何更改。您可以尝试类似的操作 p
TASKs SubTasks
=============================
Id (pk) Id (pk)
Name Name
TaskCode ParentTaskCode
现在我需要使用任务将子任务
表连接到任务
。任务代码
作为它们之间关系的键,实体框架不允许我这样做,有什么想法吗:)
注意:我没有此数据库,因此无法对结构进行任何更改。您可以尝试类似的操作
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
}
}
公共类证书
{
[关键]
公共int CertID{get;set;}
公共用户用户{get;set;}
公开测验{get;set;}
}
公共类用户
{
公共int ID{get;set;}
公共ICollection证书{get;set;}
}
公开课测验
{
public int QuizID{get;set;}
公共ICollection证书{get;set;}
}
公共类cpdContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entitiy()
.HasMany(u=>u.Certificates)
.WithRequired(c=>c.User)//或WithOptional
.Map(m=>m.MapKey(“UserID”);//美国证书)
.WithRequired(c=>c.quick)//或WithOptional
.Map(m=>m.MapKey(“QuizID”);//可能有什么我不明白的
为什么要将Task.TaskCode用作子任务的外键
如果ID是任务的主键,则删除TaskCode并将Task.ID用作fk引用
SubTasks.TaskID-->Task.ID
另外,还有一些关于命名约定的建议
- 不要将表名复数化
- 使用“ID”作为pk的名称:任务的TaskID示例
- 使用fk列作为fk的名称:例如,在子任务表中将“TaskID”作为fk
您可以尝试添加一个名为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
如果您为此使用MVC,那么您可以简单地为上述内容创建复合viewmodel
在不改变EF的情况下,你可以做你想做的事情
使班级成为
public class CompositeTaskSubtask
{
public <namespace>.<tasktablename> taskmodel { get; set; }
public <namespace>.<subtasktablename> subtaskmodel { get; set; }
}
公共类复合任务子任务
{
public.taskmodel{get;set;}
public.subtask模型{get;set;}
}
实体框架对您尝试添加关系有何评论?使taskcode唯一会改变什么吗?我使用数据库优先的方法。我使用设计器添加外键。在创建关联后…
,我指定了引用约束,这是我的问题所在?db中的关系不是唯一的已创建?问题是子任务表引用了任务中的非键项。数据库不允许为此创建外键引用,EF也不允许您在数据库中未定义外键关系的情况下创建关联。在修复数据库之前,您最好进行联接,然后选择自定义clas这是按您希望的方式构建的。是ParentTaskCode==TaskCode
?注意:我不拥有此数据库,因此无法对结构进行任何更改。好主意,但不幸的是,我不拥有数据库来进行任何更改!!如果您先使用数据库,您不需要先对数据库执行某些操作吗?不,因为这是创建的d由另一个开发人员创建,我需要对其进行只读访问。您不能至少创建另一个数据库并将所有或至少部分数据迁移到新模型吗?它是另一个应用程序的一部分。但我需要的是解决此问题的方法,因为它可能在将来或其他情况下发生。问题是我需要获取一些数据使用它们之间的关系对数据库进行操作。您希望如何将它们关联起来?当我选择子任务时,我也想获得它们的父任务。您可以尝试一件事。我没有尝试,但从概念上讲它可能会起作用。检查此项,我已经进行了一些计算。由于时间不足,我只能做到这一点。祝您一切顺利。