简体   繁体   English

实体框架代码首先在复杂实体之间建立一对一关系

[英]Entity framework code first one-to-one relation between complex entities

Guys I am new to Entity Framework, I have no Idea how to make relations using model builder. 伙计们,我是Entity Framework的新手,我不知道如何使用模型构建器建立关系。 I have tried to create relation between task and task_assignment by using this following code block. 我试图通过使用下面的代码块在task和task_assignment之间创建关系。

modelBuilder.Entity<Task>().HasOptional(t => t.TaskAssignment).WithRequired();

I want to create one-to-one relation between Task_Assignment and Employee. 我想在Task_Assignment和Employee之间创建一对一的关系。 I have tried to make relation but every approach leads me to another error. 我试图建立联系,但是每种方法都会导致另一个错误。 The most frequest ones are here. 最抢手的在这里。

A dependent property in a ReferentialConstraint is mapped to a store generated column. ReferentialConstraint中的从属属性映射到商店生成的列。 Column: 'tas_ass_id'. 列:“ tas_ass_id”。

I have following database schema. 我有以下数据库架构。

task table 任务表

CREATE TABLE [dbo].[Task] (
    [tas_id]              INT           IDENTITY (1, 1) NOT NULL,
    [tas_name]            VARCHAR (50)  NOT NULL,
    PRIMARY KEY CLUSTERED ([tas_id] ASC),
);

Task Assignment table 任务分配表

CREATE TABLE [dbo].[Task_Assignment] (
    [tas_ass_id]            INT IDENTITY (1, 1) NOT NULL,
    [tas_id]                INT NOT NULL,
    [person_responsible_id] INT NOT NULL,
    [person_notified_id]    INT NULL,
    [person_approval_id]    INT NULL,
    PRIMARY KEY CLUSTERED ([tas_ass_id] ASC),
    CONSTRAINT [FK_Task_Assignment_Task] FOREIGN KEY ([tas_id]) REFERENCES [dbo].[Task] ([tas_id]),
    CONSTRAINT [FK_Task_Assignment_EmployeeR] FOREIGN KEY ([person_responsible_id]) REFERENCES [dbo].[Employee] ([emp_id]),
    CONSTRAINT [FK_Task_Assignment_EmployeeN] FOREIGN KEY ([person_notified_id]) REFERENCES [dbo].[Employee] ([emp_id]),
    CONSTRAINT [FK_Task_Assignment_EmployeeA] FOREIGN KEY ([person_approval_id]) REFERENCES [dbo].[Employee] ([emp_id])
);

Employee table 员工表

CREATE TABLE [dbo].[Employee] (
    [emp_id]                        INT           IDENTITY (1, 1) NOT NULL,
    [emp_name]                      VARCHAR (60)  NOT NULL,NULL,
    PRIMARY KEY CLUSTERED ([emp_id] ASC),

);

Model for task 任务模型

class Task{
     public int tas_id {get; set;}
     public virtual TaskAssignment TaskAssignment {get; set;}
}

Model for Task Assignment 任务分配模型

class TaskAssignment{
     [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int tas_ass_id { get; set; }
    [Required]
    [Display(Name = "Task")]
    public int tas_id { get; set; }
    [ForeignKey("tas_id")]
    public Task Task { get; set; }

    [Required]
    [Display(Name = "Person Responsible")]
    public int person_responsible_id { get; set; }
    [ForeignKey("person_responsible_id")]
    public Employee Responsible { get; set; }

    [Display(Name = "Person Notified")]
    public int person_notified_id { get; set; }
    [ForeignKey("person_notified_id")]
    public Employee Notified { get; set; }

    [Display(Name = "Person Approval")]
    public int person_approval_id { get; set; }
    [ForeignKey("person_approval_id")]
    public Employee Approval { get; set; }
}

Model for Employee 员工模型

class Employee{
     public int emp_id {get; set;}
}

Model builder 模型制作者

protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
             //configure model with fluent API 
             modelBuilder.Entity<Task>().HasOptional(t => t.TaskAssignment).WithRequired();
             modelBuilder.Entity<TaskAssignment>().HasKey(x=>x.tas_id);

             modelBuilder.Entity<Task>().HasOptional(x=>x.TaskAssignment).WithRequired(x=>x.Task);
         }

I am really exhausted now and I have no idea what to do? 我现在真的很累,不知道该怎么办? please guide me. 请指导我。 Thanks in advance 提前致谢

The relation between TaskAssignment and Employee, according to your db scheme, is one to many (which sounds logical as one employee could be assigned to many tasks usually). 根据您的数据库方案,TaskAssignment与Employee之间的关系是一对多的(这听起来很合逻辑,因为通常可以将一名雇员分配给许多任务)。 Your problem doesn't seems to be here but between Task and TaskAssignment. 您的问题似乎不在这里,而在Task和TaskAssignment之间。

About standard entity framework one to zero-one relationships, dependent entity TaskAssignment) uses the same entity id as fk to the primary entity (Task) so your tas_id column should be PK of TaskAssignment and fk to Task, and tas_ass_id should be removed from table and class. 关于标准实体框架一对一关系,从属实体TaskAssignment使用与主实体(Task)相同的fk实体ID,因此您的tas_id列应为TaskAssignment的PK,fk为Task的,并且tas_ass_id应从表中删除和课。 Code for one to zero-one configuration: 一对一配置的代码:

builder.Entity<TaskAssignment>()
    HasKey(x=>x.tas_id);

builder.Entity<Task>()
    .HasOptional(x=>x.TaskAssignment)
    .WithRequired(x=>x.Task);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM