2014-05-09 3 views
0

Сначала я заметил проблему с кодом EF 6.1. У меня есть следующие классы:Entity Framework 6.1 - код first - свойства справки не загружаются правильно

namespace Domain 
{ 
    public interface ISupportsOptimisticConcurrency 
    { 
     byte[] RowVersion { get; set; } 
    } 

    public class Entity : ISupportsOptimisticConcurrency 
    { 
     public int Id { get; set; } 

     [Timestamp] 
     public byte[] RowVersion { get; set; } 
    } 

    public class Lookup : Entity 
    { 
     public Lookup() 
     { 
      Description = string.Empty; 
     } 

     [Required] 
     [MaxLength(100)] 
     public string Name { get; set; } 

     [MaxLength(300)] 
     public string Description { get; set; } 
    } 

    public class GroupType : Lookup 
    { 
    } 

    public class Group:Entity 
    { 
     public Group() 
     { 
       GroupType = new GroupType(); 
     } 

     [Required] 
     public string Name { get; set; } 

     [Required] 
     public Guid ExternalId { get; set; } 

     [Required] 
     public string Password { get; set; } 

     [Required] 
     public string MonitorEmail { get; set; } 

     public string UrlRequestEmail { get; set; } 

     public bool UsesDefaultOptions { get; set; } 

     [ForeignKey("GroupType")] 
     public int GroupTypeId { get; set; } 
     public virtual GroupType GroupType { get; set; } 
    } 
} 

Я написал типичный класс репозитория для доступа к данным из БД. Теперь, когда я пытаюсь найти группу по идентификатору и включаю тип GroupType, тип GroupType не загружается должным образом, а свойство Name для GroupType имеет значение null.

Интересно, когда я удалил конструктор группы, который инициализирует новый тип GroupType, все начинает работать нормально.

Не могли бы вы объяснить это поведение? Примечание. Этот же сценарий отлично работает с NHibernate, как есть.

Спасибо за ответы.

+0

Если бы я должен был угадать, я бы сказал, что имеет какое-то отношение к наследованию (и нескольким не абстрактным типам). Для GroupType нет дополнительных свойств, поэтому дискриминатор, вероятно, путается. «Entity», вероятно, должен быть «абстрактным» для начинающих, а затем работать над определением или объявлением дискриминатора для «Lookup» и «GroupType». –

+0

Вероятно, что происходит, EF видит, что уже существует GroupType, поэтому он не создает новый экземпляр. Почему у вас есть экземпляр конструктора GroupType? Вы объединяете его с возможностями навигации для коллекции? Те получают экземпляр в конструкторе, но свойства уникальной ссылочной навигации не допускаются. –

ответ

1

Я думаю, вы должны удалить логику инициализации в конструкторе Группы:

GroupType = new GroupType(); 

Это, вероятно, переписывает загруженные данные или даже не загружать его (так как он уже был экземпляра), в результате чего свойства GroupType в экземпляр, который вы инициализировали, а не тот, который находится в базе данных.

Возможно, это проблема, о которой говорилось выше here.

+0

Да, мне нужно будет это сделать, но это противоречит принципам OO, потому что, если я не инициализирую ссылочный тип в конструкторе, я не могу использовать синтаксис инициализации объекта C#, например. это не удается - уага гр = новая группа() { Name = "название", GroupType = { Name = "GT", Описания = "убывания" } }; – mmwaikar

+0

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

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