Аннотации данных в Entity Framework 5.0 (сначала база данных)

Как лучше всего использовать аннотации данных для проверки, если я использую базу данных Entity Framework (v5.0) в первую очередь?

Это мой частичный класс, созданный Entity Framework:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.ComponentModel.DataAnnotations;

namespace ACore
{
    using System;
    using System.Collections.Generic;

    public partial class PayrollMarkup_State
    {
        [UIHint("StatesEditor")] // <-- I added this line but it will be overwritten
        public string State { get; set; }
        public Nullable<float> MaintenancePercentage { get; set; }
        public Nullable<float> OfficePercentage { get; set; }
    }
}

Я пытался это безуспешно....

Сгенерированный файл Entity Framework: "PayrollMarkup_State.cs"

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.ComponentModel.DataAnnotations;

namespace ACore
{
    using System;
    using System.Collections.Generic;

    public partial class PayrollMarkup_State
    {
        public string State { get; set; }
        public Nullable<float> MaintenancePercentage { get; set; }
        public Nullable<float> OfficePercentage { get; set; }
    }
}

Затем я создал этот файл в другом каталоге: "PayrollMarkup_state.cs"

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace ACore.Models
{
    [MetadataType(typeof(PayrollMarkupMetadata))]
    public partial class PayrollMarkup_State
    {
    }

    public class PayrollMarkupMetadata
    {
        [UIHint("StatesEditor")]
        public string State; // Has to have the same type and name as your model
    }
}

4 ответа

Решение

Хотя это несколько болезненно, вам нужно создать класс для использования в качестве MetadataType для вашего модельного класса.

[MetadataType(typeof(PayrollMarkupMetadata))
public partial class PayrollMarkup_State
{
  ...
}

public class PayrollMarkupMetadata
{
    [UIHint("StatesEditor")]
    public string State; // Has to have the same type and name as your model
    // etc.
}

У вас проблема с пространством имен - вы определили два разных класса PayrollMarkup_State, один в пространстве имен ACore, а другой в пространстве имен ACore.Models. Измените пространство имен на ACore (из ACore.Models) в файле, содержащем определение типа метаданных.

Вы можете использовать частичный класс метаданных

http://www.asp.net/mvc/overview/getting-started/database-first-development/enhancing-data-validation

Я использовал два дополнительных класса: Map и Meta, вот моя карта:

namespace Whatever.Models
{
    [MetadataType(typeof(ThisMeta))]
    public partial class This
    {
    }


}

Теперь вот мета класс:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Whatever.Models
{
    public class ThisMeta
    {

        [DisplayName("")]
        public int UID { get; set; }

    }
}
Другие вопросы по тегам