Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 3.0来自同一表的2个外键异常_C#_Entity Framework - Fatal编程技术网

C# ASP.NET MVC 3.0来自同一表的2个外键异常

C# ASP.NET MVC 3.0来自同一表的2个外键异常,c#,entity-framework,C#,Entity Framework,我有两个表和每个表对应的模型:Employee和EmployeeEducation 在EmployeeEducation中,我有表Employee中的两个外键:顾问Id和拥有教育的实际员工Id。每种教育可以有不同的顾问 [Required(ErrorMessage = "Contact Admin")] [Display(Name = "Consultant")] public int? ConsultantId { get; set; } *emphasized text* [Required

我有两个表和每个表对应的模型:Employee和EmployeeEducation 在EmployeeEducation中,我有表Employee中的两个外键:顾问Id和拥有教育的实际员工Id。每种教育可以有不同的顾问

[Required(ErrorMessage = "Contact Admin")]
[Display(Name = "Consultant")]
public int? ConsultantId { get; set; }
*emphasized text*
[Required(ErrorMessage = "Contact Admin")]
public int? EmployeeId { get; set; }
对于每个idı,让这些对象到达对象

[ForeignKey("EmployeeId")]
public virtual Employee Employee { get; set; }

[ForeignKey("ConsultantId")]
public virtual Employee Consultant { get; set; }
当我运行代码并尝试与顾问一起对员工进行教育时,它会给出以下异常和一个内部异常

EntityCommandExecutionException 
{"An error occurred while executing the command definition. See the inner exception for details."}

Inner exception: SqlCeException
{"The column name is not valid. [ Node name (if any) = Extent1,Column name = Employee_Id ]"}
但当我删除顾问对象时,它不会给出一个例外。 我怎样才能解决这个问题,使我能够接触到顾问和员工本身

在detail诱惑.cshtml中发生异常:

@{ if (Model.EducationList == null || !Model.EducationList.Any())
    { 
以下是EducationList的填充方式:

public ActionResult DetailsEducation(int id) 
{ 
  Employee employee = _work.EmployeeRepository.GetSet()
    .Include(a => a.EducationList)
    .Include(a => a.EducationList.Select(c => c.University))
    .Include(a => a.EducationList.Select(c => c.Department))
    .FirstOrDefault(a => a.Id == id); 
  return PartialView("_DetailsEducation", employee);
}
列名=员工Id

当Entity Framework使用列名中带有(意外的)下划线的外键创建SQL查询时,它几乎总是一个指标,指示EF根据约定推断关系,而这是使用注释或Fluent API定义的关系之外的关系

此外键不能来自
EmployeeEducation.Employee
EmployeeEducation.Consultant
导航属性,因为对于这些属性,您已使用数据批注定义了外键名称
[ForeignKey(“EmployeeId”)]
[ForeignKey(“ConsultantId”)]

现在,EF如何检测关系?它检查模型类中的导航属性。我们已经知道,
EmployeeEducation.Employee
EmployeeEducation.Consultant
不可能是问题所在,因此一定有第三个导航属性。属于此导航属性的关系必须在
EmployeeEducation
中具有关联结尾,因为EF显然推断需要在
EmployeeEducation
表中添加外键
EmployeeID

由于名称-Employee\u Id,此导航属性将位于类
Employee
中。查看您的
Include(a=>a.EducationList)
您似乎在
Employee
中有一个集合属性:

public SomeCollectionType<EmployeeEducation> EducationList { get; set; }

注意:
EducationList
将只包含给定员工的
employeeeducations
s
employee
,而不是
Consultant
。为此,您需要在
Employee
中添加第二个集合属性,并在
Consultant
上添加
[InverseProperty]
注释。通常,不能将一个实体中的一个导航集合与另一个实体中的两个导航引用相关联。您唯一的选择是两个集合或根本不集合。(在后一种情况下,您的问题也会消失,但您将不再拥有导航属性,您可以“包括”。

1)您能给我们看一下给出异常的代码吗?2) 请注意,错误消息中的Employee_Id与属性中的EmployeeId不同。这可能有问题,也可能没有问题。它在detail诱惑.cshtml处给出异常:@{if(Model.EducationList==null | | |!Model.EducationList.Any()){Model是一个包含公共虚拟ICollection教育列表{get;set;}的Employee对象设置
Model.EducationList
的代码是什么?它位于控制器中的以下代码段中,其中id是被查看人员的employeeid公共操作结果详细信息诱惑(int id){Employee Employee=\u work.EmployeeRepository.GetSet().Include(a=>a.EducationList)。Include(a=>a.EducationList.Select(c=>c.University)).Include(a=>a.EducationList.Select(c=>c.Department)).FirstOrDefault(a=>a.Id==Id);返回PartialView(“\u detailculation”,employee);}您的实体框架模型似乎有问题。它似乎与您的数据库架构不匹配。最近是否更改了数据库,而没有更新EF模型以适应它?您可以启动SQL探查器,查看请求是如何通过的。我打赌SQL将包括DB.Yo中缺少的员工Id你将不得不更新你的EF模型,以便纠正这种不匹配。先生,你让我开心!非常感谢
[ForeignKey("EmployeeId"), InverseProperty("EducationList")]
public virtual Employee Employee { get; set; }

[ForeignKey("ConsultantId")]
public virtual Employee Consultant { get; set; }