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