Upgrade naar EF 6.1.1 doet het effect van [NotMapped] verdwijnen

Upgrade naar EF 6.1.1 doet het effect van [NotMapped] verdwijnen

Opgelost door eerst EF te verwijderen en vervolgens opnieuw te installeren op alle projecten in de oplossing.

Ik denk dat het een mismatch was in .NET-versies voor sommige projecten toen ik de eerste keer een upgrade naar EF6 uitvoerde, waardoor het systeem de [NotMapped]-annotatie van de verkeerde assembly nam (.NET in plaats van EF).

Dit bracht me ertoe:http://social.msdn.microsoft.com/Forums/en-US/2d682be0-daca-45c4-ad76-5885acc6004f/possible-bug-with-inheritance-and-notmapped?forum=adodotnetentityframework

...en de meeste de regel:"Als u de nieuwe annotaties van de System.ComponentModel.DataAnnotations.dll-assembly in .NET 4.5 gebruikt, worden ze niet verwerkt door Code First."


Ik denk ook dat er een mismatch is met de .NET-versie en EF6, waardoor het programma de [NotMapped]-annotatie van een verkeerde assembly heeft overgenomen.

Het probleem ligt met name bij het gebruik van deze twee referenties:System.ComponentModel.DataAnnotations;System.ComponentModel.DataAnnotations.Schema.

Ik merkte op dat we in deze situatie niet beide referenties in hetzelfde klassenbestand kunnen gebruiken, omdat het NotMapped-attribuut wordt toegewezen aan een andere dll van de verwachte. Zelfs als u een van deze verwijzingen in de code toewijst zonder de instructie met . te gebruiken (door bijvoorbeeld de volledige referentie op de attribuutdeclaratie te plaatsen), zal het programma nog steeds deze bug hebben.

Om dit probleem op te lossen, heb ik de referentie System.ComponentModel.DataAnnotations uit de klasse verwijderd, waardoor alleen de System.ComponentModel.DataAnnotations.Schema-referentie overblijft om het kenmerk NotMapped te gebruiken. En om de misser van de eerste referentie te leveren (formuliervalidatie-acties), implementeerde ik de validatie aan de clientzijde (met behulp van 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; }

Laat op het feest, maar ik had deze zaak:

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; }

Dit zou buitensporige dingen opleveren zoals:

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));

Door hiermee te experimenteren kwam ik tot de conclusie dat [NotMapped] wordt genegeerd als er een ander attribuut in de kolom staat. Als het mogelijk is - in mijn geval was het - verwijder het en [NotMapped] wordt niet genegeerd.