Заполнение EF6 через инициализатор и ICollection «один ко многим»

Я следую первому прохождению кода EF6 и попытался немного адаптировать его для своего собственного проекта, но столкнулся с проблемой при заполнении базы данных инициализатором.

Я создал 2 класса:

Режим свойства:

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; }
    }
}

Насколько я понимаю, между этими 2 существует отношение «один ко многим». Свойство может быть только 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"


person Gavin5511    schedule 02.08.2016    source источник
comment
PropertyType=1,. PropertyType — это сложный объект, а не целое число.   -  person Martin Dawson    schedule 02.08.2016


Ответы (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();
    }

Вам не нужны две отдельные надстройки. Entity Framework добавит вложенную коллекцию в базу данных. Всякий раз, когда вы теперь получаете доступ к этому типу свойств, он будет иметь свойства как уже загруженную подколлекцию, если вы пометите ICollection<Property> Properties как virtual, иначе вам нужно будет include() при загрузке.

person Martin Dawson    schedule 02.08.2016