2010-08-29 1 views
48

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

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

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

Есть ли способ, чтобы установить это с помощью EntityConfiguration?

+0

+1 действительно хороший вопрос. –

+0

Любое обновление по этому вопросу?Я использую VS2010 с выпущенным EF4.0, и я все еще не могу найти StoreIgnoreAttribute. Он упал? –

ответ

61

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

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

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

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

+0

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

+1

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

1

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

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

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

+0

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

+1

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

+0

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

4

В настоящее время я знаю два способа сделать это.

  1. Добавьте «динамического» ключевое слова к свойству, которое останавливает картограф сохраняющимся его:

    private Gender gender; 
    public dynamic Gender 
    { 
        get { return gender; } 
        set { gender = value; } 
    } 
    
  2. Override 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 ввести Игнорируйте, вы будете возможность легко изменить код:

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

Мой ответ был отменен @Matt. –

1

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

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

Вы также можете использовать EntityTypeConfiguration для move configurations to separate classes для лучшей управляемости:

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); 
    } 
} 
0

Добавить используя System.ComponentModel.DataAnnotations. Схема к классу модели. (Должен включать «SCHEMA»)

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

Это предотвратит их добавление в качестве столбца таблицы в db.

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