У меня есть сценарий, в котором мне нужно связать два свойства из одного класса в другой класс, используя 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);
}
Нет радости! Это все еще дало мне то же исключение.
Я не уверен, как настроить ассоциацию внешнего ключа, чтобы несколько свойств одного класса могли ссылаться на другой класс - по крайней мере, не таким образом, чтобы результат был доволен и перестал жаловаться на некоторое время.
Что я делаю не так и как это исправить?