Как привязать несколько свойств одного класса к другому с помощью Entity Framework (EF) 4.1 Code First для использования с Upshot.js?

У меня есть сценарий, в котором мне нужно связать два свойства из одного класса в другой класс, используя Entity Framework 4.1 Code-First. (Для справки: эта модель используется Upshot.js для использования в одностраничном приложении с использованием Knockout.js 2.1)

Обычно я бы сделал что-то вроде следующего:

    public class Person
    {
        [Key]
        public int PersonId { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }

        public Address HomeAddress { get; set; }
        public Address OfficeAddress { get; set; } 
    }

    public class Address
    {
        [Key]
        public int AddressId { get; set; }

        public string StreetAddress { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
    }

Это позволяет HomeAddress и OfficeAddress ссылаться на экземпляр класса Address.

Обратите внимание, что это не настоящая модель данных. Он предназначен только для иллюстративных целей. В реальной жизни я бы, вероятно, использовал ICollection. К сожалению, в данной конкретной ситуации это невозможно, и мне нужно поддерживать несколько ссылок из одного класса в другой.

В этом конкретном сценарии человек также может существовать без каких-либо определенных адресов. Адреса также могут существовать без человека. (Как уже упоминалось, эта модель данных является лишь примером.)

Хотя это компилируется правильно, и я даже могу создавать и сохранять данные, upshot горько жалуется, когда пытается использовать эту модель.

Это дает (внутреннее) исключение, подобное следующему:

{"Unable to retrieve association information for association 'KnockoutTest.Models.Person_HomeAddress'. Only models that include foreign key information are supported. See Entity Framework documentation for details on creating models that include foreign key information."}

Итак... Я попытался установить информацию о внешнем ключе в классе DbContext, например

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
    .HasOptional(m => m.HomeAddress);

    modelBuilder.Entity<Person>()
    .HasOptional(m => m.OfficeAddress);
}

Нет радости! Это все еще дало мне то же исключение.

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

Что я делаю не так и как это исправить?


person Anthony Gatlin    schedule 18.05.2012    source источник


Ответы (1)


Вам просто нужно ввести скалярные свойства внешнего ключа в класс вашей модели:

public class Person
{
    [Key]
    public int PersonId { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    [ForeignKey("HomeAddress")]
    public int? HomeAddressId { get; set; }
    public Address HomeAddress { get; set; }

    [ForeignKey("OfficeAddress")]
    public int? OfficeAddressId { get; set; } 
    public Address OfficeAddress { get; set; } 
}

Свойства должны принимать значение NULL (int?), так как ваши отношения необязательны (человек может существовать без адресов).

person Slauma    schedule 19.05.2012