EF 4.2 Игнорировать одно свойство в коде, сначала отображающем на сложный тип - PullRequest
2 голосов
/ 06 января 2012

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

Свободный API позволяет сопоставлять свойство сложного типа:

.Property(Function(c) c.HomeAddress.County).HasColumnName("COUNTY") 

Это здорово.Но, очевидно, это не позволяет вам игнорировать это:

.Ignore(Function(c) c.HomeAddress.County)

Выдает ошибку:

Выражение 'p => p.Address.County' не является допустимым выражением свойства.Выражение должно представлять свойство: C #: 't => t.MyProperty' VB.Net: 'Function (t) t.MyProperty'.

Это действительно должно быть разрешено в Fluent API и должно быть простымкак в приведенном выше утверждении.

Итак, по условию Code сначала считает, что это свойство, и вы получите ошибку:

"Неверное имя столбца 'Address_County'.

Это действительноотстой! Так что я в основном застрял с этим свойством. Как мне его игнорировать? Есть идеи?

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

Я надеюсь, что есть простое решение или, по крайней мере, адекватное решение.

Ответы [ 3 ]

5 голосов
/ 06 августа 2014

Вы можете игнорировать свойства сложного типа в 6.1.1 (точно не знаю, когда он начал получать поддержку)

public class MyDbContext
        : DbContext
{
//...
   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
      modelBuilder
         .ComplexType<[complex-type-class]>()
         .Ignore(x => x.[member-to-ignore]);

}
//...
}
1 голос
/ 06 января 2012

Это невозможно, и в настоящее время это сделано намеренно.Сначала в коде EF все еще используется EDM, а в EDM есть очень строгие правила.

  • Вы можете определить сложный тип, но все его свойства становятся частью модели
  • Каждое свойство типа сущности или комплексатип, который является частью модели, должен отображаться

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

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

1 голос
/ 06 января 2012

Хотя я не уверен на 100%, я думаю, вы не можете игнорировать только часть сложного типа.Но вы можете создать два разных сложных типа (потому что это действительно так), может быть, EF будет в порядке с производным одного от другого (не уверен).Или создайте представление, которое будет иметь этот столбец, но с NULL (это значение по умолчанию для строки в любом случае).

...