我试图为"代码优先"设置EF类。方法,使用EF page at Data Developer Center中概述的技术,相关的SO回答here,另一个SO帖子here和this article在CodeProject.com。
两个类需要使用数据注释进行一对多交互,特别是外键。
我的课程似乎一切都井然有序。我可以执行context.Add()
,但在通过context.SaveChanges()
保存更改时,我收到以下错误消息:
属性'机器'上的ForeignKeyAttribute在类型上 ' BacklogTracker.Models.EFModels.Customer'无效。外国的 关键名称' MachID'没有在依赖类型上找到。
为什么我收到此错误?
根据本问题开头链接中列出的示例和技术,我的EF类和外键似乎是有序的......但我无法弄清楚错误是什么。我是初学者,所以我很可能完全错过了一些东西。
我使用VS2013 Express,.NET framework 4.5,EF 6.1.2。这是类的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class Customer
{
public Customer()
{
Machines = new List<Machine>();
}
[Key]
public int Number { get; set; }
public string Name { get; set; }
public string MachID { get; set; }
[ForeignKey("MachID")]
public virtual List<Machine> Machines { get; set; }
}
和
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class Machine
{
public Machine()
{
Customer = new Customer();
}
[Key]
public string SN { get; set; }
public string Model { get; set; }
public int Hours { get; set; }
public string Location { get; set; }
public int CustID { get; set; }
[ForeignKey("CustID")]
public virtual Customer Customer { get; set; }
}
答案 0 :(得分:0)
你应该删除:
public string MachID { get; set; }
[ForeignKey("MachID")]
如果我理解正确的话,EF可以从机器方面推断出这种关系
另外,你不应该有ID属性吗?
答案 1 :(得分:0)
这可能是因为您正在注释List而不是Machine类本身。我不确定是否可以在类似的集合上定义关系。
答案 2 :(得分:0)
根据您的密码,我认为客户与机器之间的关系为one-to-many
。 One
客户拥有many
台机器,并且一台机器由一位客户拥有。
通过外键CustID
将计算机分组到客户。对于具有相同CustID
的那些机器,它们属于同一客户。如果客户有一个名为MachID
的列,则意味着一台机器有很多客户。这将与一个客户拥有许多机器这一事实相冲突。
@Nathan正准备删除这些代码。
如果MachID
应该存在,那么您需要回答一个关于客户和机器之间存在什么关系的问题。是many-to-many
,one-to-many
还是many-to-one
?如果关系为many-to-many
,则您的代码完全错误。
public class Customer
{
[Key]
public int Number { get; set; }
// One customer has many machines, so the `MachID` SHOULD NOT exist.
// public string MachID { get; set; }
// [ForeignKey("MachID")]
public virtual List<Machine> Machines { get; set; }
}
public class Machine
{
[Key]
public string SN { get; set; }
...
public int CustID { get; set; }
[ForeignKey("CustID")]
public virtual Customer Customer { get; set; }
}