EntityFramework сгенерированные классы - PullRequest
1 голос
/ 06 ноября 2011

У меня есть модель EF, которую я сгенерировал с использованием методологии DataBase First. На конструкторе я создал «элемент генерации кода», используя объект DBContext. Это создало шаблон, который генерировал классы POCO для моих таблиц (которые я хочу).

Я использовал эти же классы для кодирования в них атрибутов WCF и DataAnnotation, которые работали нормально. Я сохранил копию этого файла и, если модель была восстановлена, я просто вставил бы старый код во вновь созданный класс, сгенерированный моделью, и обновил бы все новые свойства.

Я пытался сделать шаг вперед. Всякий раз, когда я меняю модель, классы восстанавливаются и атрибуты теряются. Я пытался создать отдельную папку в своем проекте с теми же именами классов, которые определяли бы ее по пространству имен. Я в основном скопировал бы любые свойства, которые были изменены в сгенерированных классах POCO, в другой класс в новой папке, которую я создал, и просто добавил все необходимые мне атрибуты. Это, однако, будет почти то же самое, что и во втором абзаце выше. Однако, если существует модель большой базы данных, это может стать утомительным и привести к ошибкам.

Что я хочу сделать, так это как-то эмулировать генерацию модели без потери атрибутов. Да, я знаю - иметь свой торт и есть его тоже ...

Есть идеи?

Я пытался добавить классы друзей, но это не сработало.

С данными все в порядке, но после добавления классов собеседников, как я делал ниже, аннотации данных не работают.

Я подумал, что, возможно, мне нужно изменить метод обслуживания, чтобы включить объект Customer_Validation вместо Customer и сделать то же самое для клиента.

Я собирался внести это изменение, но столкнулся с препятствием на следующем фрагменте кода в моем методе обслуживания ( Это даже после того, как я изменил определение DbContext , что, конечно, является другим сгенерированным кодом учебный класс.). Произошла ошибка компиляции во время разработки на p.CustomerID. Его не существует.

IQueryable<**Customer_Validation**> customer = DbContext.Customers.Where(p => **p.CustomerID** > 0);


 public DbSet<**Customer_Validation**> Customers { get; set; }

Чего мне не хватает, чтобы заставить работать аннотации данных? Ваша помощь очень ценится:)

У меня есть следующее для моего класса Клиента.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.ComponentModel.DataAnnotations;
using DataAnnotationsExtensions;

namespace YeagerTechModel
{
    [MetadataType(typeof(Customer_Validation))]
    public partial class Customer
    {

    }

    public partial class Customer_Validation
    {
        [Serializable]
        [DataContract(IsReference = true)]
        public class Customer1
        {
            public Customer1()
            {
                this.Projects = new HashSet<Project>();
            }

            [DataMember]
            public short CustomerID { get; set; }

            [DataMember]
            [Required]
            [StringLength(50)]
            [DataType(DataType.EmailAddress)]
            [Email]
            public string Email { get; set; }

            [DataMember]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string Company { get; set; }

            [DataMember]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string FirstName { get; set; }

            [DataMember]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string LastName { get; set; }

            [DataMember]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string Address1 { get; set; }

            [DataMember]
            [StringLength(50)]
            [DataType(DataType.Text)]
            public string Address2 { get; set; }

            [DataMember]
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string City { get; set; }

            [DataMember]
            [StringLength(2, MinimumLength = 2, ErrorMessage = "Must have a length of 2.")]
            [DataType(DataType.Text)]
            public string State { get; set; }

            [DataMember]
            [StringLength(10)]
            [DataType(DataType.Text)]
            [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip")]
            public string Zip { get; set; }

            [DataMember]
            [StringLength(12)]
            [DataType(DataType.PhoneNumber)]
            [RegularExpression(@"^\s*([\(]?)\[?\s*\d{3}\s*\]?[\)]?\s*[\-]?[\.]?\s*\d{3}\s*[\-]?[\.]?\s*\d{4}$", ErrorMessage = "Invalid Phone")]
            public string HomePhone { get; set; }

            [DataMember]
            [StringLength(12)]
            [DataType(DataType.PhoneNumber)]
            [RegularExpression(@"^\s*([\(]?)\[?\s*\d{3}\s*\]?[\)]?\s*[\-]?[\.]?\s*\d{3}\s*[\-]?[\.]?\s*\d{4}$", ErrorMessage = "Invalid Phone")]
            public string CellPhone { get; set; }

            [DataMember]
            [StringLength(100)]
            [DataType(DataType.Url)]
            [Url]
            public string Website { get; set; }

            [DataMember]
            [StringLength(50)]
            [DataType(DataType.EmailAddress)]
            [Email]
            public string IMAddress { get; set; }

            [DataMember]
            public System.DateTime CreatedDate { get; set; }

            [DataMember]
            public Nullable<System.DateTime> UpdatedDate { get; set; }

            [DataMember]
            public virtual ICollection<Project> Projects { get; set; }
        }
    }
}

Мой метод веб-службы следующий:

public IEnumerable<Customer> GetCustomers()
        {
            YeagerTechEntities DbContext = new YeagerTechEntities();

            DbContext.Configuration.ProxyCreationEnabled = false;

            IQueryable<Customer> customer = DbContext.Customers.Where(p => p.CustomerID > 0);

            CloseConnection(DbContext);

            return customer;
        }

Мой клиентский метод вызывает вышеуказанный сервисный метод со следующими данными:

IEnumerable<YeagerTechModel.Customer> customerList = db.GetCustomers();

                    return View(new GridModel<YeagerTechModel.Customer>
                    {
                        Data = customerList
                    });

Мой взгляд выглядит следующим образом:

@model Telerik.Web.Mvc.GridModel<YeagerTechModel.Customer>
@{
    ViewBag.Title = "Customer Index";
}
<h2>
    Customer Index</h2>
@(  Html.Telerik().Grid<YeagerTechModel.Customer>(Model.Data)
      .Name("Customers")
            .DataKeys(dataKeys => dataKeys.Add(o => o.CustomerID)
                                            .RouteKey("CustomerID"))
                .ToolBar(commands => commands.Insert().ButtonType(GridButtonType.Text).ImageHtmlAttributes(new { style = "margin-left:0" }))
      .Columns(columns =>
            {
                columns.Bound(o => o.CustomerID).Hidden(true);
                columns.Command(commands =>
                {
                    commands.Edit().ButtonType(GridButtonType.Text);
                }).Width(200).Title("Command");
                columns.Bound(o => o.Email).Width(200).Filterable(false);
                columns.Bound(o => o.Company).Width(200).Filterable(false);
                columns.Bound(o => o.FirstName).Width(100).Title("FName").Filterable(false);
                columns.Bound(o => o.LastName).Width(100).Title("LName").Filterable(false);
                columns.Bound(o => o.Address1).Width(200).Title("Addr1").Filterable(false).Sortable(false);
                columns.Bound(o => o.Address2).Width(100).Title("Addr2").Filterable(false).Sortable(false);
                columns.Bound(o => o.City).Width(100);
                columns.Bound(o => o.State).Width(40).Title("ST");
                columns.Bound(o => o.Zip).Width(60);
                columns.Bound(o => o.HomePhone).Width(120).Filterable(false).Sortable(false);
                columns.Bound(o => o.CellPhone).Width(120).Filterable(false).Sortable(false);
                columns.Bound(o => o.Website).Width(100).Filterable(false).Sortable(false);
                columns.Bound(o => o.IMAddress).Width(100).Filterable(false).Sortable(false);
                columns.Bound(o => o.CreatedDate).Format("{0:MM/dd/yyyy}").ReadOnly(true).Width(120).Filterable(false).Sortable(false);
                columns.Bound(o => o.UpdatedDate).Format("{0:MM/dd/yyyy}").ReadOnly(true).Width(120).Filterable(false).Sortable(false);
            }).DataBinding(dataBinding =>
                dataBinding.Ajax()
                        .Insert("_InsertAjaxEditing", "Customer")
                        .Update("_SaveAjaxEditing", "Customer"))
    .Editable(editing => editing.Mode(GridEditMode.InLine))
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
 )

1 Ответ

0 голосов
/ 06 ноября 2011

Вы можете изменить шаблон T4 для включения атрибутов при создании классов.

Вы также можете рассмотреть возможность использования объектов передачи данных и аннотирования их вместо ваших сущностей.В настоящее время я работаю над проектом, использующим EF 4.1 (сначала db) и WCF, и я использую AutoMapper для сопоставления между моими DTO и сущностями.Мой сервисный API принимает и возвращает DTO, которые затем отображаются в хранилище для сущностей.Это позволяет мне формировать данные, предоставляемые сервисом, когда я не хочу, чтобы они выглядели точно так, как они хранятся в базе данных.

Для получения дополнительной информации о плюсах и минусах использования DTO, см. Это MSDN, статья .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...