Сопоставление защищенных свойств в Entity Framework 4.1 - PullRequest
2 голосов
/ 28 сентября 2011

Я хочу иметь защищенный список в классе, доступный через методы.В этой теме предлагается создать класс конфигурации внутри класса моей модели, который мне не очень нравится, но пока он работает .. Итак, у меня есть что-то вроде этого:

public class Person
    {
        public int Id { set; get; }
        public string Name { set; get; }

        List<string> _address = new List<string>();

        protected virtual ICollection<string> address { get { return this._address; } }

        [NotMapped]
        public string[] Address { get { return this.address.ToArray(); } }  // I know it's not efficient.. I'll cache it.

        public void AddAddress(string address)
        {
            // some business logic
            this.address.Add(address);
        }

        public class OneMapping : EntityTypeConfiguration<Person>
        {
            public OneMapping()
            {
                this.HasMany(x => x.address);
            }
        }
    }

и в контексте БД:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add<Person>(new Person.OneMapping());
   base.OnModelCreating(modelBuilder);
}

Контекст БД выдает это исключение, когда я пытаюсь добавить экземпляр лица:

Свойство навигации 'адрес' не являетсяобъявленное свойство типа «Персона».Убедитесь, что он не был явно исключен из модели и является допустимым свойством навигации.

Так что на самом деле не работает.Попробовал этот пример: Отображение частных свойств с помощью EF 4.1 Не удалось с той же ошибкой.

Еще одно решение - использовать ObservableCollection и связывать бизнес-логику в событиях, но эта логика не нужназапускаться, когда объекты создаются EF - только тогда, когда они создаются пользователем ... что невозможно.

Так что я несколько застрял здесь ... Я надеюсь, что кто-то там уже столкнулся с этим ирешил это ..

Спасибо!

1 Ответ

3 голосов
/ 28 сентября 2011

Ваше свойство навигации не имеет установщика, поэтому оно не может быть отображено. Все сопоставленные свойства должны иметь доступный метод получения и установки, потому что EF может назначать их во время материализации сущности. Это было верно для EDMX, где по крайней мере был необходим частный установщик, но в случае кода сначала он работает даже без установщика.

Как правило, EF-код в первую очередь не очень хороший инструмент, если вы хотите поиграть с доступностью сопоставленных свойств.

Edit:

Btw. Ваш адрес не является набором сущностей, а набором строк - это также не поддерживается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...