C# 首先忽略实体框架4.1代码中的类属性

C# 首先忽略实体框架4.1代码中的类属性,c#,.net,entity-framework,ef-code-first,entity-framework-4.1,C#,.net,Entity Framework,Ef Code First,Entity Framework 4.1,我的理解是,[NotMapped]属性在EF 5之前不可用,EF 5目前在CTP中,因此我们无法在生产中使用它 如何将EF 4.1中的属性标记为忽略 更新:我注意到了一些奇怪的事情。我使用了[NotMapped]属性,但出于某种原因,EF 4.1仍然在数据库中创建一个名为Disposed的列,即使公共bool Disposed{get;private set;}标记为[NotMapped]。当然,这个类实现了IDisposable,但我不认为这有什么关系。有什么想法吗?您可以使用NotMappe

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

如何将EF 4.1中的属性标记为忽略


更新:我注意到了一些奇怪的事情。我使用了
[NotMapped]
属性,但出于某种原因,EF 4.1仍然在数据库中创建一个名为Disposed的列,即使
公共bool Disposed{get;private set;}
标记为
[NotMapped]
。当然,这个类实现了
IDisposable
,但我不认为这有什么关系。有什么想法吗?

您可以使用
NotMapped
属性数据注释来指示代码首先排除特定属性

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
命名空间中

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}
流畅的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; }
}
公共班级学校上下文:DbContext
{
公立学校上下文(DbContextOptions):基本(选项)
{
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().Ignore(t=>t.FullName);
基于模型创建(modelBuilder);
}
公共数据库集客户{get;set;}
}

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

在我看来,它也应该应用于实体框架4.1。查看此链接:@SamLeach:我在发布自己的问题之前已经阅读了该问题,但没有找到解决方案。问题是如何在EF4中实现同样的效果?我在那篇文章中遗漏了什么吗?这也是我的想法,因为我有EF4.1并且可以看到属性。但EF似乎很乐意在我的应用程序中完全忽略它。本机和引用类型以及com引用类型(如MS office intrerop应用程序)都是如此。很抱歉,我现在用一个简单的应用程序进行了测试,结果正常。你能提供示例代码吗?谢谢。看到背后有努力的答案总是好的。事实上,我没有注意到你在另一个答案上的最后一行。既然你的答案以前确实来过,我认为把你的改为正确才是公平的。我相信@ilmatte不会介意。对于EF的v5>,它们现在位于System.ComponentModel.DataAnnotations.Schemaw中。当我使用FluentMApping时,该字段仍然会在resultset中返回,尽管它为NULL。如何使其不被返回?使用[NotMapped]还将告诉其他序列化程序(例如JSON/XML)不要映射此属性。如果您只希望阻止映射到数据库表,但仍然让序列化程序访问该属性,则必须使用OnModelCreating方法。虽然我还没有完全弄清楚如何进行,但这对entity framework 6+上继承的属性不起作用。该属性和fluent api似乎忽略了该指令。是否仍然如此?我使用的是EF 6.0,至少我的项目不再如此。除非我引用了一个已经在某处引用了上述内容的名称空间。
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; }
}