2013-04-13 2 views
0

Возможно создание экземпляра классов, созданных для VisualStudio при использовании DataBase First?Как отразить классы EntityFramework (первый подход модели)?

Я имею в виду, что я использую шаблоны t4 и команду «Сгенерировать код» с использованием шаблонов T4 для обновления инструментов MVC3 для создания моих классов из db со многими отношениями.

Могу ли я использовать отражение, чтобы «заполнить» свойства экземпляра, например «Студент» этого класса в отдельной сборке (dll)?

Например, с 3-х таблиц: «курсы» «студенты» «studentsCourses»

у меня будет 3 лица, на курсы, один для студентов и один для отношений. Могу ли я получить объект или тип «ученик» и использовать отражение, чтобы «заполнить» все его свойства? И если да, как я могу это достичь?

Я уже знаю, что я могу получить объект по ссылке как «тип объекта» (с использованием дженериков), но я просто не могу понять, как создать и/или заполнить сложные свойства (например, в свойстве studentsCourses)

Любой совет заблаговременно.

Здесь я позволяю скрипт для создания таблицы и базы данных "COURSES_TEST":

USE [master] 
GO 
/****** Object: Database [COURSES_TEST] Script Date: 04/12/2013 23:47:18 ******/ 
CREATE DATABASE [COURSES_TEST] ON PRIMARY 
(NAME = N'COURSES_TEST', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\COURSES_TEST.mdf' , SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'COURSES_TEST_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\COURSES_TEST_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
GO 
ALTER DATABASE [COURSES_TEST] SET COMPATIBILITY_LEVEL = 100 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [COURSES_TEST].[dbo].[sp_fulltext_database] @action = 'enable' 
end 
GO 
ALTER DATABASE [COURSES_TEST] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET ARITHABORT OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [COURSES_TEST] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [COURSES_TEST] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [COURSES_TEST] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET DISABLE_BROKER 
GO 
ALTER DATABASE [COURSES_TEST] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [COURSES_TEST] SET READ_COMMITTED_SNAPSHOT OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET HONOR_BROKER_PRIORITY OFF 
GO 
ALTER DATABASE [COURSES_TEST] SET READ_WRITE 
GO 
ALTER DATABASE [COURSES_TEST] SET RECOVERY SIMPLE 
GO 
ALTER DATABASE [COURSES_TEST] SET MULTI_USER 
GO 
ALTER DATABASE [COURSES_TEST] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [COURSES_TEST] SET DB_CHAINING OFF 
GO 
USE [COURSES_TEST] 
GO 
/****** Object: Table [dbo].[students] Script Date: 04/12/2013 23:47:19 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[students](
    [studentID] [int] IDENTITY(1,1) NOT NULL, 
    [name] [nvarchar](50) NULL, 
    [lastName] [nvarchar](50) NULL, 
CONSTRAINT [PK_students] PRIMARY KEY CLUSTERED 
(
    [studentID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[courses] Script Date: 04/12/2013 23:47:19 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[courses](
    [courseID] [int] IDENTITY(1,1) NOT NULL, 
    [course] [nchar](10) NULL, 
    [description] [nvarchar](50) NULL, 
CONSTRAINT [PK_courses] PRIMARY KEY CLUSTERED 
(
    [courseID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Studentscourses] Script Date: 04/12/2013 23:47:19 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Studentscourses](
    [courseStudentID] [int] IDENTITY(1,1) NOT NULL, 
    [courseID] [int] NULL, 
    [studentID] [int] NULL, 
CONSTRAINT [PK_Studentscourses] PRIMARY KEY CLUSTERED 
(
    [courseStudentID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: ForeignKey [FK_Studentscourses_courses] Script Date: 04/12/2013 23:47:19 ******/ 
ALTER TABLE [dbo].[Studentscourses] WITH CHECK ADD CONSTRAINT [FK_Studentscourses_courses] FOREIGN KEY([courseID]) 
REFERENCES [dbo].[courses] ([courseID]) 
GO 
ALTER TABLE [dbo].[Studentscourses] CHECK CONSTRAINT [FK_Studentscourses_courses] 
GO 
/****** Object: ForeignKey [FK_Studentscourses_students] Script Date: 04/12/2013 23:47:19 ******/ 
ALTER TABLE [dbo].[Studentscourses] WITH CHECK ADD CONSTRAINT [FK_Studentscourses_students] FOREIGN KEY([studentID]) 
REFERENCES [dbo].[students] ([studentID]) 
GO 
ALTER TABLE [dbo].[Studentscourses] CHECK CONSTRAINT [FK_Studentscourses_students] 
GO 
+0

Почему вы хотите использовать отражение? Это вряд ли когда-либо необходимо в нормальном производственном коде. Возможно, в инфраструктурных компонентах. Какая картина? –

+0

Действительно, я не согласен с использованием отражения, но меня попросили сделать это. Большая картинка, это то, что некоторые уже запущенные веб-сайты отправляют мне объект (он имеет одинаковую базовую структуру), и я должен «заполнить его» определенной информацией, но они не хотят изменять проекты, чтобы сделать ссылку к моей DLL, вместо этого они просто хотят изменить строку, в которой объект построен, для вызова метода в моей DLL для отправки объекта. (Я вообще не понимаю, я не архитектор, но с моим небольшим опытом я не чувствую, что отражение - это не тот путь). – Allende

+0

Вы не можете согласиться на обмен списком пар ключ-значение, например '{property1," value1 "}, {property2," 2 "}, {property3," 2013/4/13 "}, ...' –

ответ

1

Если я правильно Вас понял, EF создает что-то вроде

class YourStudent 
{ 
    public int studentId { get; set; } 
    public string name { get; set; } 
    public string lastName { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 
} 

и там is

class TheirStudent 
{ 
    public int studentId {get;set;} 
    public string name { get; set; } 
    public string lastName { get; set; } 
} 

, и вы хотите ввести значения из экземпляра YourStudent в экземпляр YourStudent.

Может быть что-то вроде

YourStudent s1; 
TheirStudent s2; 
Type t = typeof(YourStudent); 
Type t2 = typeof(TheirStudent); 

foreach (PropertyInfo pinfo in t.GetProperties()) 
{ 
    if (pinfo.GetGetMethod().IsVirtual && 
     pinfo.PropertyType.IsGenericType && 
     pinfo.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>)) 
    { 

     // This is [probably] a nav property. Courses would be in here 
    } 
    else if (pinfo.GetGetMethod().IsVirtual) 
    { 
     // if you have 0..1 or 1..1 nav properties you might muck around in here 
    } 
    else if (!pinfo.GetGetMethod().IsVirtual) 
    { 
     // This is [probably] a column - studentId, name, etc would be here 

     // you could pull values over like so: 
     PropertyInfo pinfo2 = (from ps in t2.GetProperties() 
           where ps.Name == pinfo.Name 
           select ps).SingleOrDefault(); 
     if (pinfo2 != null) 
     { 
      object value = pinfo2.GetValue(s2, new object[] { }); 
      pinfo.SetValue(s1, value, new object[] { }); 
     } 
    } 
} 
+0

Я мог бы сделать что-то подобное, как вы упомянули, но моя проблема заключается в свойствах nav, они работают рекурсивно или что-то еще, когда вы их смотрите, вы можете расширяться и расширяться до конца времен, как я могу создать это свойства nav? возможно ? – Allende

Смежные вопросы