#c# #.net #entity-framework #entity-framework-4 #ef4-code-only
#c# #.net #entity-framework #entity-framework-4 #ef4-только код
Вопрос:
Как мне создать не сохраняемые свойства, используя codefirst EF4?
MS говорит, что есть атрибут StoreIgnore, но я не могу его найти.
Есть ли способ настроить это с помощью 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:
На данный момент я знаю два способа сделать это.
-
Добавьте ключевое слово ‘dynamic’ к свойству, которое остановит его сохранение mapper:
private Gender gender; public dynamic Gender { get { return gender; } set { gender = value; } }
-
Переопределите 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.