Как не сохранить сначала код свойства EF4?

#c# #.net #entity-framework #entity-framework-4 #ef4-code-only

#c# #.net #entity-framework #entity-framework-4 #ef4-только код

Вопрос:

Как мне создать не сохраняемые свойства, используя codefirst EF4?

MS говорит, что есть атрибут StoreIgnore, но я не могу его найти.

http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx

Есть ли способ настроить это с помощью EntityConfiguration?

Комментарии:

1. Есть какие-либо обновления по этому поводу? Я использую VS2010 с выпущенным EF4.0, и я все еще не могу найти StoreIgnoreAttribute. Его уронили?

Ответ №1:

В CTP5, основанном на коде EF, вы можете использовать [NotMapped] аннотацию.

 using System.ComponentModel.DataAnnotations;
public class Song
{
    public int Id { get; set; }
    public string Title { get; set; }

    [NotMapped]
    public int Track { get; set; }
  

Комментарии:

1. При попытке использовать этот атрибут я получаю ошибку во время компиляции. Не определено. Какая ссылка и «использование» нам для этого нужны?

2. Возможно, вам потребуется добавить ссылку на System. ComponentModel. Примечания к данным. dll и использование System. ComponentModel. Примечания к данным; Я обновил свой пост примером кода.

3. Я столкнулся с ошибкой, когда у меня впервые появилась ссылка на System. ComponentModel. Примечания к данным. dll, а затем добавил ссылку на EntityFramework.dll . Не удалось разрешить атрибут NotMapped. Удаление и повторное добавление системы. ComponentModel. Примечания к данным. ссылка на dll решила проблему. Произошло в VS2010 SP1.

4. Я использовал [System.ComponentModel.DataAnnotations.Schema.NotMapped] который, казалось, сделал свое дело.

Ответ №2:

На данный момент я знаю два способа сделать это.

  1. Добавьте ключевое слово ‘dynamic’ к свойству, которое остановит его сохранение mapper:

     private Gender gender;
    public dynamic Gender
    {
        get { return gender; }
        set { gender = value; }
    }
      
  2. Переопределите OnModelCreating в DbContext и переназначьте весь тип, опустив свойства, которые вы не хотите сохранять:

     protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Person>().MapSingleType(p => new { p.FirstName, ... });
    }         
      

Используя метод 2, если команда EF введет Ignore, вы сможете легко изменить код на:

      modelBuilder.Entity<Person>().Property(p => p.IgnoreThis).Ignore();
  

Комментарии:

1. Мой ответ был заменен @Matt.

Ответ №3:

Если вы не хотите использовать аннотации, вы можете использовать Fluent API. Переопределите OnModelCreating и используйте Ignore() метод DbModelBuilder. Предположим, у вас есть объект ‘Song’:

 public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Song>().Ignore(p => p.PropToIgnore);
    }
}
  

Вы также можете использовать EntityTypeConfiguration для перемещения конфигураций в отдельные классы для лучшей управляемости:

 public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new SongConfiguration());
    }

}

public class SongConfiguration : EntityTypeConfiguration<Song>
{
    public SongConfiguration()
    {
        Ignore(p => p.PropToIgnore);
    }
}
  

Ответ №4:

Я не уверен, доступно ли это еще.

На этой странице MSDN описаны атрибут Ignore и API, но ниже, в комментариях, кто-то пишет 4 июня 2010 года:

Вы сможете игнорировать свойства в следующем выпуске Code First,

Комментарии:

1. Вау, это кажется огромным целым в истории code-first. объектам code first будет сложно создать расширенную модель предметной области, если они не могут содержать данные в виде свойств, которые не являются прямой строкой в базе данных.

2. Проблема в том, что Code first — это еще не RTM, а только CTP, поэтому на данный момент он предназначен только для оценки, а не для производственного использования.

3. Тем временем создайте дополнительные «свойства» в виде методов, а не свойств, поскольку они не сохраняются. Затем вы можете продолжить разработку кода для соответствующих объектов. Как только атрибут StoreIgnore станет доступен, его легко изменить обратно на свойство и обновить все ссылки.

Ответ №5:

Добавьте с помощью System.ComponentModel.Примечания к данным.Схема для класса model. (Должно включать «СХЕМУ»)

Добавьте аннотацию данных [NotMapped] к полю (полям), которые вы хотите сохранить от сохранения (т.Е. не сохранить в базе данных).

Это предотвратит их добавление в виде столбца в таблицу в БД.

Пожалуйста, обратите внимание — предыдущие ответы, возможно, включали эти биты, но в них не было полного предложения «using». Они просто оставили «схему», в соответствии с которой определен атрибут NotMapped.