2011-09-29 3 views
12

My Model:EF-код первый сложный типа с навигационным свойством

public class Country 
{ 
    public int CountryId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

public class Location 
{ 
    public string Address { get; set; } 

    public virtual int CountryId { get; set; } 
    public virtual Country Country { get; set; } 
}  

public class User{ 

    protected User() 
    { 
     Location = new Location(); 
    } 

    public int UserId { get; set; } 
    public Location Location { get; set; } 

} 

При создании базы данных, я получаю:

One or more validation errors were detected during model generation: 

System.Data.Edm.EdmEntityType: : EntityType 'Location' has no key defined. Define the key for this EntityType. 
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �Locations� is based on type �Location� that has no keys defined. 

Как есть навигационное свойство внутри сложного типа? Если я удалю навигационную собственность страны, она работает нормально.

ответ

10

Свойства навигации (ссылающиеся на другие объекты) на сложный тип не поддерживаются. Вы должны либо сделать свой Location сущностью (со своей собственной таблицей), либо удалить навигационное свойство Country от Location (и добавить атрибут [ComplexType], как упомянуто Стивом Морганом).

Редактировать

Ссылка: http://msdn.microsoft.com/en-us/library/bb738472.aspx

"Сложный тип не может содержать навигационные свойства."

+0

Но как насчет 'CountryID' целого класса' Location'? Можно ли сделать это ограничение внешнего ключа? (У меня есть аналогичная проблема и я не могу заставить ее работать) –

+0

@ Исак: Нет, это невозможно. Если вы хотите иметь его в базе данных, вы должны сделать это непосредственно в базе данных, но EF не будет его отражать. –

+1

Тот факт, что это не поддерживается, упоминается непосредственно в описании типа Complex на MSDN: http://msdn.microsoft.com/en-us/library/bb738472.aspx –

3

EF хочет вывести первичный ключ для местоположения, но не может.

Добавить public int LocationId { get; set; } в класс Location, и он должен быть счастлив.

Если вы хотите использовать Location как сложный тип, отметьте его с помощью атрибута [ComplexType].

+0

Это создаст совершенно новую таблицу. Я хочу, чтобы он был сложным. –

+0

Извините - отредактировал мой ответ - надеюсь, что это поможет. –

Смежные вопросы