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


299

我的理解是,该[NotMapped]属性直到CTP中的EF 5才可用,因此我们不能在生产中使用它。

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

更新:我注意到其他奇怪的事情。我可以使用该[NotMapped]属性,但是由于某些原因,即使使用public bool Disposed { get; private set; }标记为,EF 4.1仍会在数据库中创建一个名为Disposed的列[NotMapped]IDisposeable当然,该类实现了,但我不认为这应该有多重要。有什么想法吗?



在我看来,它也应同样适用于Entity Framework 4.1。检查此链接:social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/...
ilmatte

1
@SamLeach:我已经在发布自己的问题之前阅读了该问题,但没有找到解决方案。问题是如何在EF4中实现相同?我错过了那个帖子吗?
拉赫尔·汗

自从有了EF 4.1并可以看到该属性后,我也是这样想的。但是EF似乎很高兴在我的应用程序中完全忽略它。本机和引用类型以及com引用类型(例如MS Office Intrerop应用程序)都是如此。
拉赫尔·汗

抱歉,我现在使用一个简单的应用程序进行了测试,它可以正常工作。您可以提供示例代码吗?
ilmatte 2012年

Answers:


594

您可以使用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名称空间中。

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}

http://msdn.microsoft.com/zh-CN/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; }
}

流利的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; }
}

3
谢谢。努力查看答案总是很高兴的。在标记另一个答案正确之前,我实际上没有注意到您的最后一行。由于您的答案确实是之前提出的,因此我认为将您的答案更改为正确是公平的。我敢肯定@ilmatte不会介意的。
拉赫尔·汗

13
随着EF v5>的发布,这些内容现在位于System.ComponentModel.DataAnnotations.Schema中
Daveo 2013年

当我使用FluentMApping时,尽管它是NULL知道的,但仍然在结果集中返回该字段。我如何才能不退货?
罗德尼

8
使用[NotMapped]还将告诉其他序列化器(例如JSON / XML)不映射此属性。如果只希望防止映射到数据库表,而让序列化程序访问该属性,则必须使用OnModelCreating方法。
maxmantz

尽管我还没有完全弄清楚该如何做,但是这对于在实体框架6+上继承的属性不起作用,该属性和流利的api似乎忽略了该指令
PBo

35

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


2
还是这样吗?我使用的是EF 6.0,至少在我的项目中不再如此。除非我已经引用了上面提到的名称空间。
JARRRRG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.