忽略 Entity Framework 4.1 Code First 中的类属性

Posted

技术标签:

【中文标题】忽略 Entity Framework 4.1 Code First 中的类属性【英文标题】:Ignoring a class property in Entity Framework 4.1 Code First 【发布时间】:2012-05-10 05:52:53 【问题描述】:

我的理解是,[NotMapped] 属性在当前处于 CTP 的 EF 5 之前不可用,因此我们无法在生产中使用它。

如何在 EF 4.1 中标记要忽略的属性?

更新:我发现了一些奇怪的东西。我得到了[NotMapped] 属性,但由于某种原因,即使public bool Disposed get; private set; 标有[NotMapped],EF 4.1 仍会在数据库中创建一个名为 Disposed 的列。该类当然实现了IDisposeable,但我不明白这有什么关系。有什么想法吗?

【问题讨论】:

见***.com/questions/3595404/… 在我看来,它也应该适用于 Entity Framework 4.1。检查此链接:social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/… @SamLeach:我在发布自己的问题之前已经阅读了该问题,但没有找到解决方案。问题是如何在 EF4 中实现相同的功能?我错过了该帖子中的某些内容吗? 这也是我的想法,因为我有 EF 4.1 并且可以看到该属性。但 EF 似乎很乐意在我的应用程序中完全忽略它。本机和引用类型以及 com 引用类型(例如 MS office intrerop 应用程序)都是如此。 很抱歉,我现在用一个简单的应用程序进行了测试,它可以工作。能否提供示例代码? 【参考方案1】:

您可以使用NotMapped 属性数据注释来指示 Code-First 排除特定属性

public class Customer

    public int CustomerID  set; get; 
    public string FirstName  set; get;  
    public string LastName set; get;  
    [NotMapped]
    public int Age  set; get; 

[NotMapped] 属性包含在 System.ComponentModel.DataAnnotations namespace 中。

您也可以在 DBContext 类中使用 Fluent API 覆盖 OnModelCreating 函数来执行此操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);

http://msdn.microsoft.com/en-us/library/hh295847(v=vs.103).aspx

我检查的版本是EF 4.3,这是您使用 NuGet 时可用的最新稳定版本。


编辑2017 年 9 月

Asp.NET Core(2.0)

数据标注

如果您使用的是 asp.net core(撰写本文时为 2.0),则可以在属性级别使用 [NotMapped] 属性。

public class Customer

    public int Id  set; get; 
    public string FirstName  set; get;  
    public string LastName  set; get;  
    [NotMapped]
    public int FullName  set; get; 

Fluent API

public class SchoolContext : DbContext

    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<Customer>().Ignore(t => t.FullName);
        base.OnModelCreating(modelBuilder);
    
    public DbSet<Customer> Customers  get; set; 

【讨论】:

谢谢。看到背后付出努力的答案总是很好的。在将另一个答案标记为正确之前,我实际上并没有注意到您的最后一行。由于您的答案之前确实出现过,我认为将您的答案更改为更正是公平的。我相信@ilmatte 不会介意的。 随着 v5 > EF 这些现在存在于 System.ComponentModel.DataAnnotations.Schema 当我使用 FluentMApping 时,该字段仍会在结果集中返回,尽管知道它为 NULL。我怎样才能让它甚至不被退回? 使用 [NotMapped] 还会告诉其他序列化程序(例如 JSON / XML)不要映射此属性。如果您只想阻止映射到数据库表,但仍然让序列化程序访问该属性,则必须使用 OnModelCreating 方法。 虽然我还没有完全弄清楚如何,但这不适用于实体框架 6+ 上继承的属性,属性和流利的 api 似乎忽略了指令【参考方案2】:

从 EF 5.0 开始,您需要包含 System.ComponentModel.DataAnnotations.Schema 命名空间。

【讨论】:

还是这样吗?我正在使用 EF 6.0,至少我的项目不再是这种情况。除非我引用了一个名称空间,该名称空间已经在某处引用了上述内容。

以上是关于忽略 Entity Framework 4.1 Code First 中的类属性的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 4.1 - 动态预加载

Entity Framework 4.1 两个跟踪查询

Entity Framework 4.1 InverseProperty 属性和ForeignKey

Entity Framework 4.1 Fluent API 属性

卸载 Entity Framework 4.1 六月 CTP

通过 Entity Framework 4.1 中的用户定义函数进行热切加载