Добавление дополнительных свойств к объектной структуре 4 кодирует первый объект CTP 5 - PullRequest
8 голосов
/ 01 марта 2011

Я использую ASP.NET MVC 3 и Entity Framework code first CTP 5. Мне было интересно, если можно добавить дополнительные свойства, которые не отображаются в столбце таблицы?

У меня есть класс новостей, и он определяется так:

public class News : Entity
{
   public int NewsId { get; set; }
   public string Title { get; set; }
   public string Body { get; set; }
   public bool Active { get; set; }
}

Класс контекста моей базы данных:

public class MyContext : DbContext
{
   public DbSet<News> Newses { get; set; }
}

В классе сущностей у меня есть свойство, определенное как:

public IList<RuleViolation> RuleViolations { get; set; }

У меня пока нет кода этой части, но я хочу, чтобы все нарушенные правила были добавлены в этот список при проверке объекта. Я получаю ошибку:

One or more validation errors were detected during model generation:

    System.Data.Edm.EdmEntityType: : EntityType 'RuleViolation' has no key defined. Define the key for this EntityType.
    System.Data.Edm.EdmEntitySet: EntityType: The EntitySet RuleViolations is based on type RuleViolation that has no keys defined.

Вот мой код репозитория:

public News FindById(int newsId)
{
   return context.Database.SqlQuery<News>("News_FindById @NewsId",
      new SqlParameter("NewsId", newsId)).FirstOrDefault();
}

ОБНОВЛЕНИЕ 2011-03-02:

Вот мой Entity класс:

public class Entity
{
   public IList<RuleViolation> RuleViolations { get; set; }

   public bool Validate()
   {
      // Still needs to be coded
      bool isValid = true;

      return isValid;
   }
}

Вот мой RuleViolation класс:

public class RuleViolation
{
   public RuleViolation(string parameterName, string errorMessage)
   {
      ParameterName = parameterName;
      ErrorMessage = errorMessage;
   }

   public string ParameterName { get; set; }
   public string ErrorMessage { get; set; }
}

Вот мой контекстный класс:

public class MyContext : DbContext
{
   public DbSet<News> Newses { get; set; }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
      modelBuilder.Entity<News>().Ignore(n => n.RuleViolations);
   }
}

Ответы [ 2 ]

17 голосов
/ 01 марта 2011

Вы можете игнорировать тип, используя Fluent API, добавив правило игнорирования в OnModelCreating метод вашего MyContext класса

public class MyContext : DbContext {

  public DbSet<News> Newses { get; set; }

  protected override void OnModelCreating(ModelBuilder builder) {

    builder.Ignore<RuleViolation>()

  }

}

Или вы можете игнорировать свойство, используя атрибут NotMapped

public class Enitity {

  [NotMapped]
  public IList<RuleViolation> RuleViolations { get; set; }

  //other properties here

}

и тогда Entity Framework будет игнорировать свойство.

4 голосов
/ 01 марта 2011

Вы также можете использовать:

[NotMapped]
public IList<RuleViolation> RuleViolations { get; set; }

Для использования NotMapped необходимо добавить using System.ComponentModel.DataAnnotations;

Редактировать:

Теперь я вижу, что вы хотите избежать отображения свойства из базового класса. Это не работает с OnModelCreating - это подтвержденная ошибка в CTP5 (я постараюсь найти ссылку позже). Я не уверен, работает ли он с NotMappedAttribute. Этот атрибут является просто другим подходом для достижения того же результата.

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