我已从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]是什么意思?
(升级前工作完美)
答案 0 :(得分:5)
首先卸载然后在解决方案中的所有项目上重新安装EF。
我认为当我第一次升级到EF6时,某些项目的.NET版本有些不匹配,这使得系统从错误的程序集(.NET而不是EF)中获取[NotMapped]注释。
...和大多数行:&#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文件可解决此问题。