升级到EF 6.1.1会使[NotMapped]的效果消失

时间:2014-09-03 14:18:30

标签: c# asp.net-mvc entity-framework-4 entity-framework-6

我已从EF 4.3.1升级到6.1.1,现在似乎注释[NotMapped]无用。是的,我已经改变了正确的装配,一切看起来都很合适。

在存在[NotMapped]的地方,属性被作为域属性处理,我得到一个错误,EF无法在数据库中找到匹配的列。

示例:

private bool _authenticated = true;

        [NotMapped]
        public bool Authenticated
        {
            get { return _authenticated; }
            set { _authenticated = value; }
        }

是的,似乎我可以通过添加...来解决这个问题。

 modelBuilder.Entity<User>().Ignore(x => x.Authenticated);

...但是,那么,在EF6中使用[NotMapped]是什么意思?

(升级前工作完美)

4 个答案:

答案 0 :(得分:5)

首先卸载然后在解决方案中的所有项目上重新安装EF。

我认为当我第一次升级到EF6时,某些项目的.NET版本有些不匹配,这使得系统从错误的程序集(.NET而不是EF)中获取[NotMapped]注释。

这导致我:http://social.msdn.microsoft.com/Forums/en-US/2d682be0-daca-45c4-ad76-5885acc6004f/possible-bug-with-inheritance-and-notmapped?forum=adodotnetentityframework

...和大多数行:&#34;如果你使用新的  .NET 4.5中System.ComponentModel.DataAnnotations.dll程序集的注释  它们不会被Code First处理。&#34;

答案 1 :(得分:2)

我还认为与.NET版本和EF6存在一些不匹配,这使得程序从错误的程序集中获取[NotMapped]注释。

特别是,问题在于使用这两个引用:System.ComponentModel.DataAnnotations; System.ComponentModel.DataAnnotations.Schema。

我注意到,在这种情况下,我们不能在同一个类文件中使用这两个引用,因为NotMapped属性将被分配给期望的不同dll。即使您在代码中指定了其中一个引用而没有使用使用指令(例如,将完整引用放在属性声明中),程序仍然会有这个错误。

为了解决这个问题,我从类中删除了引用System.ComponentModel.DataAnnotations,只留下System.ComponentModel.DataAnnotations.Schema引用来使用NotMapped属性。为了提供第一个引用(表单验证操作)的缺失,我在客户端实现了验证(使用jquery + javascript)。

using System;
using System.Collections.Generic;
//using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

public partial class Account
{       

    //[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "O campo nome é obrigatório!")]
    //[System.ComponentModel.DataAnnotations.StringLength(50, ErrorMessage = "O campo nome deve possuir no máximo 50 caracteres!")]
    //[System.ComponentModel.DataAnnotations.Display(Name = "Nome")]
    public string Name { get; set; }

    //[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "O campo nome é obrigatório!")]
    //[System.ComponentModel.DataAnnotations.StringLength(100, ErrorMessage = "O campo email deve possuir no máximo 100 caracteres!")]
    //[System.ComponentModel.DataAnnotations.Display(Name = "Email")]
    public string Email { get; set; }

    //[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "O campo senha é obrigatório!")]
    //[System.ComponentModel.DataAnnotations.Display(Name = "Senha")]
    //[System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.Password)]
    [NotMapped]
    public string Password { get; set; }

    //[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "O campo confirmação de senha é obrigatório!")]
    //[System.ComponentModel.DataAnnotations.Display(Name = "Confirmação da senha")]
    //[System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.Password)]
    //[System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "A confirmação da senha está diferente da senha informada.")]
    [NotMapped]
    public string ConfirmPassword { get; set; }

答案 2 :(得分:1)

晚会,但我有这个案子:

using System.ComponentModel.DataAnnotations;//I needed this for [Key] attribute on another property
using System.ComponentModel.DataAnnotations.Schema;//this one is for [NotMapped]
...
[ScriptIgnore]
[NotMapped]
public System.Timers.Timer Timer { get; set; }

这会产生令人发指的东西,如:

AddColumn("dbo.mytable", "Timer_AutoReset", c => c.Boolean(nullable: false));
AddColumn("dbo.mytable", "Timer_Enabled", c => c.Boolean(nullable: false));
AddColumn("dbo.mytable", "Timer_Interval", c => c.Double(nullable: false));

试验这一点,我得出的结论是,如果列上有另一个属性,[NotMapped]将被忽略。如果有可能 - 在我的情况下是 - 删除它,[NotMapped]将不会被忽略。

答案 3 :(得分:0)

我遇到的问题是过时的.EDMX文件(创建该文件是为了加快应用程序的启动时间)。它是在添加[NotMapped]属性之前生成的,因此该属性包含了“ NotMapped”属性。

添加NotMapped属性后重新生成.EDMX文件可解决此问题。