类型为“Equipment.Models.Device”的属性“TypeId”上的ForeignKeyAttribute无效

时间:2014-01-16 13:58:15

标签: c# entity-framework foreign-keys dbcontext ef-migrations

你好,我的外键声明有问题。

App编译但由于错误我无法执行“添加迁移”:

  

“Equipment.Models.Device”类型的属性“TypeId”上的ForeignKeyAttribute无效。在依赖类型“Equipment.Models.Device”上找不到导航属性“DeviceDictionaryId”。 Name值应该是有效的导航属性名称

在这里您可以看到我的代码:

namespace Equipment.Models
{
    public class Device
    {
        public int DeviceId { get;set; }
        [Required]
        [StringLength(14)]
        public string DeviceUser { get; set; }
        [ForeignKey("DeviceDictionaryId")]
        public int TypeId { get; set; }
    }
    public class DeviceDBContext: DbContext
    {
        public DbSet<Device> Devices {get; set;}
    }

}

和第二课:

namespace Equipment.Models
{
    public class DeviceDictionary
    {

        public int DeviceDictionaryId { get; set; }
        [Required]
        public string DeviceManufacturer { get; set; }
        [Required]
        public string DeviceName { get; set; }

}
     public class DeviceDictionaryDBContext : DbContext
     {
         public DbSet<DeviceDictionary> Dictionary { get; set; }
     }
}

有人可以建议我需要编辑吗?

3 个答案:

答案 0 :(得分:3)

您正在创建两个单独的DbContext个对象。尝试只添加一个:

public class MyDbContext: DbContext
{
    public DbSet<Device> Devices {get; set;}
    public DbSet<DeviceDictionary> Dictionaries { get; set; }
}

Context必须引用两个类,以便它知道它们的存在。这样它就可以完成它的工作,即使用外键在这些类之间设置引用。

答案 1 :(得分:1)

试试这个......

namespace Equipment.Models
{
    public class Device
    {
        public int DeviceId { get;set; }
        [Required]
        [StringLength(14)]
        public string DeviceUser { get; set; }
        [ForeignKey("DeviceDictionaryId")]
        public int DeviceDictionaryId { get; set; }
    }
    public class DeviceDBContext: DbContext
    {
        public DbSet<Device> Devices {get; set;}
    }

}

将属性命名为DeviceDictionaryId而不是TypeId,以允许EF约定完成其工作!

修改

刚看到另一个答案后你注意到你有两个单独的DBContext!

答案 2 :(得分:0)

我相信你需要改变

[ForeignKey("DeviceDictionaryId")]
public int TypeId { get; set; }

[ForeignKey("DeviceDictionary")]
public int TypeId { get; set; }

...换句话说,注释需要指定表而不是列。

正如其他人指出的那样,您只需要一个DBContext,每个表都有一个DbSet。