首先使用代码进行外键分配

时间:2016-10-26 19:02:52

标签: c# mysql .net ef-code-first

我正在创建一个MVC应用程序,并希望使用Code First方法生成数据库。我用简单的表格完成了这个,但是现在我正在介绍外键关系,对我来说事情变得混乱。

我有三个类,每个类在DataBase中都有自己的表:

public class Device
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int InternalDeviceID { get; set; }

        public int DeviceID { get; set; }

        public string DeviceName { get; set; }

        public virtual EquipmentDevice EquipmentDevice { get; set; }
    }

public class Equipment
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int InternalEquipmentID { get; set; }

        public int EquipmentID { get; set; }

        public string EquipmentName { get; set; }

        public virtual EquipmentDevice EquipmentDevice { get; set; }
    }

public class EquipmentDevice
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int InternalEquipmentDeviceID { get; set; }

        public virtual ICollection<Equipment> EquipmentID { get; set; }

        public virtual ICollection<Device> DeviceID { get; set; }
    }

关系是一个设备可能有很多设备,一个设备可能属于许多设备(如果我没有弄错的话,可以是多个设备)。为了组织哪些设备具有与之关联的设备,我使用的是EquipmentDevice表,它只将它们的ID与该表的内部ID配对。

根据我发现的其他例子,我认为这是编码这种情况的方式,其中关系的许多方面将具有ICollection&lt;&gt;单面的对象,以及关系的单面将具有多面的虚拟对象(两个类对于N:N具有另一个的ICollection&lt;&gt;,或者具有对于1:1的虚拟的两者)

但是,当我创建数据库时,我的表看起来像这样:

设备表 enter image description here

设备表 enter image description here

设备装置表

enter image description here

我只是在为我的桌子设置外键的方式倒退,还是我在这种情况下完全缺少另一个问题?我找不到关于这个主题的特别有用的信息来源。我还附上了这些表格的图表,只是为了帮助更清楚。

enter image description here

2 个答案:

答案 0 :(得分:1)

您已经关闭 - 设备和设备上的属性需要是ICollections。您不需要为连接表定义类,EF将为您处理。这是你的课程应该是什么样子(这是一个很好的参考:)

http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

    public class Device
            { 
                public Device() 
                { this.Equipments = new HashSet<Equipment>();}

                [Key]
                [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
                public int InternalDeviceID { get; set; }

                public int DeviceID { get; set; }

                public string DeviceName { get; set; }

                public virtual ICollection<Equipment> Equipments { get; set; }
            }

    public class Equipment
        {

            public Equipment()
            { this.Devices = new HashSet<Device>(); }

            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int InternalEquipmentID { get; set; }

            public int EquipmentID { get; set; }

            public string EquipmentName { get; set; }

            public virtual ICollection<Devices> Devices { get; set; }
        }

答案 1 :(得分:1)

要生成外键,首先要做的是创建模型。

public class Device
{   
    [Key]
    public int DeviceID { get; set; }
    public string DeviceName { get; set; }

    public virtual ICollection<Equipment> Equipments { get; set; }
}

public class Equipment
{        
    [Key]
    public int EquipmentID { get; set; }
    public string EquipmentName { get; set; }

    public virtual ICollection<Device> Devices { get; set; }
}

然后为每个模型生成并编译驱动程序。 通过生成第一个模型,创建“上下文”。

enter image description here

加载项目并检查您是否可以访问创建的驱动程序。

enter image description here

现在检查数据库。该表在新表中有两个外键是自动创建的。