实体框架外键数据注释

时间:2015-03-02 21:58:17

标签: c# asp.net entity-framework

我试图为"代码优先"设置EF类。方法,使用EF page at Data Developer Center中概述的技术,相关的SO回答here,另一个SO帖子herethis 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; }
}

3 个答案:

答案 0 :(得分:0)

你应该删除:

public string MachID { get; set; }
[ForeignKey("MachID")]
如果我理解正确的话,

EF可以从机器方面推断出这种关系

另外,你不应该有ID属性吗?

答案 1 :(得分:0)

这可能是因为您正在注释List而不是Machine类本身。我不确定是否可以在类似的集合上定义关系。

答案 2 :(得分:0)

根据您的密码,我认为客户与机器之间的关系为one-to-manyOne客户拥有many台机器,并且一台机器由一位客户拥有。

通过外键CustID将计算机分组到客户。对于具有相同CustID的那些机器,它们属于同一客户。如果客户有一个名为MachID的列,则意味着一台机器有很多客户。这将与一个客户拥有许多机器这一事实相冲突。

@Nathan正准备删除这些代码。

如果MachID应该存在,那么您需要回答一个关于客户和机器之间存在什么关系的问题。是many-to-manyone-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; }
}