向实体框架添加其他属性4首先编码CTP 5实体

时间:2011-03-01 14:29:36

标签: asp.net asp.net-mvc entity-framework entity-framework-4 asp.net-mvc-3

我正在使用ASP.NET MVC 3Entity 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 个答案:

答案 0 :(得分:17)

您可以通过向OnModelCreating类的MyContext方法添加忽略规则来忽略使用Fluent API的类型

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

}

然后实体框架将忽略该属性。

答案 1 :(得分:4)

您也可以使用:

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

要使用NotMapped,您必须添加using System.ComponentModel.DataAnnotations;

编辑:

现在我看到你想避免从基类映射属性。它不适用于OnModelCreating - 它是CTP5中确认的错误(我稍后会尝试查找链接)。我不确定它是否适用于NotMappedAttribute。该属性只是实现相同结果的其他方法。