База данных First с POCO

Я новичок в Entity Framework и пытаюсь работать с POCO. Большинство учебных пособий кажутся сначала база данных с сгенерированным кодом ИЛИ сначала код с POCO. Не так много (хотя есть несколько), которые имеют дело с Database First с помощью POCO.

Моя установка: я пытаюсь использовать EF в существующем проекте, который немного больше. Чтобы просто ответить на мой вопрос, я попытался выполнить следующую настройку.

У меня есть проект, содержащий одну модель EDMX, подключенную к одной таблице в локальной базе данных. Затем я скопировал сгенерированный код из файла Model.Designer.cs в другой файл .cs в проекте. . Затем я установил для параметра Стратегия создания кода значение Нет. Затем я создаю класс контекста, как показано ниже.

public class LocalDB : ObjectContext
{
    public const string ConnectionString = "name=LocalEntities";
    public const string ContainerName = "LocalEntities";

    public ObjectSet<Product_Listing> OpenList;

    public LocalDB() :  base(ConnectionString, ContainerName) 
    {
        OpenList = CreateObjectSet<Product_Listing>(); //InvalidOperationException!!
    }
}

Проблема. Когда я нажимаю на конструктор, я получаю следующее исключение:

InvalidOperationException. «Не удалось найти информацию о сопоставлении и метаданных для EntityType «EFFTrial.LocalAccess.Product_Listing».

Буду признателен за любую помощь. Книга, которая у меня есть (Лермана), связана с EF-4, но я думаю, что мой код на VS 2010 и .Net 4 поддерживает EF-6. Как я уже упоминал выше, я новичок, поэтому не настраиваюсь на версии, пока могу обойтись без .Net 4.5.


person O.O.    schedule 10.03.2014    source источник
comment
Мне немного любопытно. Вы используете ObjectContext и ObjectSet намеренно или только потому, что следуете книге, написанной для EF4?   -  person Leron_says_get_back_Monica    schedule 10.03.2014
comment
Лерон. Как упоминалось в последнем абзаце выше, я слежу за книгой Лермана Programming EF. К сожалению, он основан на EF4, но я не уверен, что проблема в нем.   -  person O.O.    schedule 10.03.2014


Ответы (1)


Избавьте себя от неприятностей:

http://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

Обратный генератор EntityFramework POCO

OR

http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

Энергетические инструменты Entity Framework, бета-версия 4

Обратный инжиниринг Code First — создает классы POCO, производное сопоставление DbContext и Code First для существующей базы данных.

===========================================

Запустите его перед тем, как уйти на вечер... и проверьте настройки заставки. (Ака, это может занять некоторое время, особенно «Электроинструменты».

===========================================

Вот пример «Клиента» Northwind. Возможно, вы можете сопоставить его со своей таблицей.

namespace NorthWindyDataLayer.Models
{
    [Serializable]
    public partial class Customer
    {
        public Customer()
        {

        }

        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }

    }
}



using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace NorthWindyDataLayer.Models
{
    public partial class WindyContext : DbContext
    {
        static WindyContext()
        {
            //Database.SetInitializer<WindyContext>(null);
        }

        public WindyContext()
            : base("Name=NorthwindContext")
        {
        }

        public DbSet<Customer> Customers { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new CustomerMap());
        }
    }
}




using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;

namespace NorthWindyDataLayer.Models.Mapping
{
    public class CustomerMap : EntityTypeConfiguration<Customer>
    {
        public CustomerMap()
        {
            // Primary Key
            this.HasKey(t => t.CustomerID);

            // Properties
            this.Property(t => t.CustomerID)
                .IsRequired()
                .IsFixedLength()
                .HasMaxLength(5);

            this.Property(t => t.CompanyName)
                .IsRequired()
                .HasMaxLength(40);

            this.Property(t => t.ContactName)
                .HasMaxLength(30);

            this.Property(t => t.ContactTitle)
                .HasMaxLength(30);

            this.Property(t => t.Address)
                .HasMaxLength(60);

            this.Property(t => t.City)
                .HasMaxLength(15);

            this.Property(t => t.Region)
                .HasMaxLength(15);

            this.Property(t => t.PostalCode)
                .HasMaxLength(10);

            this.Property(t => t.Country)
                .HasMaxLength(15);

            this.Property(t => t.Phone)
                .HasMaxLength(24);

            this.Property(t => t.Fax)
                .HasMaxLength(24);

            // Table & Column Mappings
            this.ToTable("Customers");
            this.Property(t => t.CustomerID).HasColumnName("CustomerID");
            this.Property(t => t.CompanyName).HasColumnName("CompanyName");
            this.Property(t => t.ContactName).HasColumnName("ContactName");
            this.Property(t => t.ContactTitle).HasColumnName("ContactTitle");
            this.Property(t => t.Address).HasColumnName("Address");
            this.Property(t => t.City).HasColumnName("City");
            this.Property(t => t.Region).HasColumnName("Region");
            this.Property(t => t.PostalCode).HasColumnName("PostalCode");
            this.Property(t => t.Country).HasColumnName("Country");
            this.Property(t => t.Phone).HasColumnName("Phone");
            this.Property(t => t.Fax).HasColumnName("Fax");
        }
    }
}
person granadaCoder    schedule 10.03.2014
comment
Я использовал Entity Framework Power Tools Beta 4... и узнал больше о том, как EF выполняет сопоставление POCO, из нее... чем из любой книги. (Если вы уже достаточно хорошо знаете свою схему БД). ИЛИ Закодируйте свою собственную мини-базу данных DDL... с некоторыми базовыми таблицами 1:N, M:N и M:N (с атрибутом отношения)... и реконструируйте эту базу данных. - person granadaCoder; 10.03.2014
comment
Отделение. Работник. Сотрудник принадлежит к 1 отделу и должен иметь отдел. Ресурс. Сотрудник может иметь 0 или N ресурсов. Название работы. Сотрудник может иметь 0 или N JobTitle(s) с известной StartDate. (Обратите внимание, StartDate является атрибутом отношения между Employee-JobTitle) ........ Напишите эту небольшую базу данных со всеми таблицами, таблицами ссылок и FK ... и вы можете перепроектировать, как обратное сопоставление POCO работает достаточно быстро. - person granadaCoder; 10.03.2014
comment
Спасибо, granadaCoder. Я посмотрю на эти инструменты. Однако мне любопытно, что я делаю неправильно. Это простая таблица, в ней нет внешних ключей или каких-либо сложностей. Просто int и строки для столбцов. Я пытаюсь узнать о Entity Framework, а не просто выполнить свою работу, поэтому я был бы признателен, если бы узнал, какие ошибки я совершаю. - person O.O.; 10.03.2014
comment
Я не говорю делать это, потому что это легко. Я говорю... вы можете гораздо быстрее узнать, что такое установка, когда вы перепроектируете то, что хорошо знаете. Вы скажете: «О, вот как это свойство сопоставляется»... После того, как я реконструировал простую базу данных, я смог сам написать код для другой базы данных. Я постоянно ношу с собой Proof Of Concept. - person granadaCoder; 10.03.2014
comment
Спасибо, granadaCoder. Я знаю, что вы использовали Reverse POCO Generator, как упоминалось выше, но мне любопытно, является ли это вообще Entity Framework. Если вы посмотрите на строку подключения в app.config, вы увидите, что она использует SqlClient вместо EntityClient. Почему? Это то же самое, что и Entity Framework? - person O.O.; 11.03.2014
comment
Мое ~общее~ предположение состоит в том, что обратному Poco требуется намного больше данных, чем предоставляет EntityClient. Он должен читать таблицы, FK и ограничения ... и этот язык может отличаться от RDBMS для RDBMS. Если бы вам приходилось работать с Oracle в каком-либо режиме DBA или DDL, это вас бы напрягло. Мое ~~ предположение, что вы могли бы попытаться переключиться на Entity Client постфактум... так как я думаю, что это абстрагированная версия. Но я предполагаю... Я здесь не эксперт. - person granadaCoder; 12.03.2014
comment
Спасибо, granadaCoder - person O.O.; 12.03.2014