【问题标题】:Entity Framework Foreign Key DataAnnotations实体框架外键数据注释
【发布时间】:2015-03-02 21:58:16
【问题描述】:

我正在尝试使用EF page at Data Developer Center、相关 SO 答案here、另一个 SO 线程 herethis article 中概述的技术为“代码优先”方法设置 EF 类在 CodeProject.com。

两个类需要使用数据注释进行一对多交互,特别是外键。

我的课程似乎一切都井井有条。我可以执行context.Add(),但是通过context.SaveChanges() 保存更改时,我收到以下错误消息:

类型上属性“机器”上的 ForeignKeyAttribute “BacklogTracker.Models.EFModels.Customer”无效。外国的 在依赖类型上找不到键名“MachID”。

为什么会出现此错误?

根据本问题开头链接中概述的示例和技术,我的 EF 类和外键似乎是有序的……但我不知道出了什么问题。我是这方面的初学者,所以很可能我完全错过了一些东西。

我正在使用 VS2013 Express、.NET 框架 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; }
}

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    根据你的代码,我想客户和机器之间的关系是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; }
    }
    

    【讨论】:

      【解决方案2】:

      你应该删除:

      public string MachID { get; set; }
      [ForeignKey("MachID")]
      

      如果我理解正确,EF 可以从机器端推断关系

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

      【讨论】:

      • 不幸的是,这并没有回答这个问题。使用外键是因为我不在某些类上使用 ID 属性,请将我的问题中的链接指向顶部。
      • 每台机器都关联一个客户,对吧?所以你可以在这里定义一个外键关系,但是定义一个客户到机器的外键没有意义,因为每个客户可以与许多机器相关联。还是我不了解您的预期模型?
      【解决方案3】:

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

      【讨论】:

      • 那更适合做评论!
      • 对不起!我是堆栈溢出的新手,没有足够的声誉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多