8

我正在使用ASP.NET MVC 3Entity Framework code first CTP 5。我想知道是否可以添加未映射到表列的其他属性?向实体框架添加其他属性4代码优先CTP 5实体

我haved一个新闻类,它的定义是这样的:

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. 

这里是我的reposity代码:

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 cl屁股:

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

回答

17

可以使用流利的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 

} 

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

+0

@David:我到底会把这段代码放在哪里? – 2011-03-01 14:36:34

+0

@Brendan我用代码示例更新了答案。 – 2011-03-01 14:45:05

+0

@David:谢谢你的扩展答案。我是否需要包含base.OnModelCreating(modelBuilder);?如果是这样,那么我需要在这段代码之前还是之后包含代码? – 2011-03-02 06:14:17

4

您还可以使用:

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

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

编辑:

现在我看到你要避免从基类的映射属性。它不适用于OnModelCreating - 这是CTP5中确认的错误(我将尽力在稍后找到链接)。我不确定它是否适用于NotMappedAttribute。这个属性是实现相同结果的其他方法。

+0

我决定和戴夫的建议一起使用OnModelCreating。你为什么建议使用NotMapped而不是OnModelCreating?即使我做了Dave的建议,我仍然会遇到错误。你能否看到我更新的帖子。 – 2011-03-02 06:32:20

+0

我添加了一些细节。 – 2011-03-02 07:24:28

+0

我使用了modelBuilder.Ignore ();它的工作原理,但就像我说我不舒服使用它,我宁愿忽略。我认为现在我将排除从我的实体类派生并将RuleViolations属性移动到我的新闻类,然后忽略完美。只是现在,直到bug被修复。 – 2011-03-02 07:34:01