EF6通过初始化器和一对多ICollection播种

时间:2016-08-02 10:16:53

标签: asp.net-mvc entity-framework entity-framework-6 initializer icollection

我首先遵循EF6代码,并尝试稍微调整以适应我自己的项目,但是在使用初始化程序为数据库播种时遇到了问题。

我创建了两个类:

属性模式:

namespace MyApp.Models

{
    public class Property
    {
        public int ID { get; set; }
        public string PropertyName { get; set; }

        public virtual PropertyType PropertyType { get; set; }
    }
}

和属性类型模式:

namespace MyApp.Models
{
    public class PropertyType
    {
        public int ID { get; set; }
        public string Type { get; set; }

        public ICollection<Property> Properties { get; set; }
    }
}

我的理解是这两者之间存在一对多的关系。一个属性只能是1个属性类型,但是许多属性可以具有相同的属性类型?

但是,当我尝试初始化上下文并为数据库播种时(使用下面的代码),我收到一个错误:

    public class MyAppInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<MyAppContext>
{
    protected override void Seed(MyAppContext context)
    {
        var propertytypedata = new List<PropertyType>
        {
            new PropertyType {ID = 1, Type="Villa" },
            new PropertyType {ID = 2, Type="Apartment" }
        };

        propertytypedata.ForEach(p => context.PropertyType.Add(p));
        context.SaveChanges();

        var propertydata = new List<Property>
        {
            new Property {PropertyName="Property 1", PropertyType=1, }
        };

        propertydata.ForEach(p => context.Property.Add(p));
        context.SaveChanges();
    }
}

问题是,当我尝试在我播种的属性上设置属性类型时,它说:

  

无法将类型'int'隐式转换为'MyApp.Models.PropertyType'

1 个答案:

答案 0 :(得分:1)

示例:

protected override void Seed(MyAppContext context)
    {
        var propertytypedata = new List<PropertyType>
        {
            new PropertyType {ID = 1, Type="Villa" },
            new PropertyType {ID = 2, Type="Apartment" }
        };

        foreach(var propertyType in propertytypedata){                 
             propertyType.Properties = new List<Property>
             {
                 new Property {PropertyName="Property 1", PropertyType = propertyType, }
             };
             context.PropertyType.Add(propertyType)
        }

        context.SaveChanges();
    }

您不需要两次单独添加。实体框架将子集合添加到数据库。现在,只要您将ICollection<Property> Properties标记为virtual,就会将属性作为已加载的子集合使用,否则在加载时您需要include()