POCO
Entity Framework 4: auto relacionamento
0Pessoal vamos ver como construir um auto relacionamento no Entity Framework 4 + POCOs.
1-Classes
1: public class Category
2: {
3: public virtual int CategoryId { get; set; }
4: public String Name { get; set; }
5: public virtual Category Parent { get; set; }
6:
7: }
Classe de categoria que possui uma auto-referencia
Pronto! todo o resto do código não é necessário.
2-Configuração
1: public class CategoryConfiguration : EntityConfiguration<Category>
2: {
3: public CategoryConfiguration()
4: {
5: Property(p => p.CategoryId).IsIdentity();
6: }
7: }
3-DataContext
1: public class DataContext
2: {
3:
4: public static Model FactoryDataContext()
5: {
6: String connection = @"Data Source=.\SQLEXPRESS;Initial Catalog=EFv4SelfReference;Integrated Security=SSPI;";
7: var builder = new ContextBuilder<Model>();
8: builder.Configurations.Add(new CategoryConfiguration());
9: return builder.Create(new SqlConnection(connection));
10: }
11:
12: public static void CreateDataBase()
13: {
14:
15: var ctx = FactoryDataContext();
16: if (ctx.DatabaseExists())
17: ctx.DeleteDatabase();
18: ctx.CreateDatabase();
19:
20: }
21:
22: }
4-Model
1: public class Model : ObjectContext
2: {
3: public Model(EntityConnection entityConnection)
4: : base(entityConnection)
5: {
6: DefaultContainerName = "Model";
7: }
8: public IObjectSet<Category> Categories
9: {
10: get { return base.CreateObjectSet<Category>(); }
11: }
12: }
5-Exemplo
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: DataContext.CreateDataBase();
6: Category category1 = new Category();
7: category1.Parent = null;
8: category1.Name = "cat1";
9: category1.Parent = new Category() { Name = "Parent1" };
10:
11: Model model = DataContext.FactoryDataContext();
12: model.Categories.AddObject(category1);
13: model.SaveChanges();
14:
15: foreach (var category in model.Categories)
16: {
17: Console.WriteLine("Category Name:" + category.Name + "\n");
18: if (category.Parent != null)
19: Console.WriteLine("Parent Name:" + category.Parent.Name + "\n");
20: else
21: Console.WriteLine("Parent Name: --");
22:
23: Console.WriteLine("\n\n");
24:
25:
26: }
27:
28: Console.ReadKey();
29: }
30:
31:
32: }
Entity Framework 4:Herança no modelo TPC
0
A versão 1.0 do Entity Framework já disponibilizava o recurso de herança entre entidades. Agora vamos ver como funciona a herança no Entity Framework 4 + POCOs.O exemplo aqui postado foi baseado neste post.
1-Entidades
vamos começar criando as entidades.
1: public class Person
2: {
3: public virtual int PersonID { get; set; }
4: public virtual String Name { get; set; }
5: public virtual String Email { get; set; }
6: }
1: public class AcademicPerson:Person
2: {
3: public virtual String Enrolment { get; set; }
4: }
2-Configurações
1:
2: public class PersonConfiguration : EntityConfiguration<Person>
3: {
4: public PersonConfiguration()
5: {
6: Property(p => p.PersonID).IsIdentity();
7: MapHierarchy(p => new
8: {
9: p.PersonID,
10: p.Name,
11: p.Email,
12: }).ToTable("Person");
13: }
14: }
na configuração da classe base uso o método MapHierarchy para definir um novo tipo e apontar para tabela person
1: public class AcademicPersonConfiguration : EntityConfiguration<AcademicPerson>
2: {
3: public AcademicPersonConfiguration()
4: {
5: MapHierarchy(ap => new
6: {
7: ap.PersonID,
8: ap.Enrolment
9: }).ToTable("AcademicPerson");
10:
11: }
12: }
Aqui é necessário mapear apenas a chave e os novos campos
Pronto! todo o código pra herança está ai. agora vamos continuar o exemplo para testar.
3-Modelo
1: public class Model : ObjectContext
2: {
3: public Model(EntityConnection entityConnection)
4: : base(entityConnection)
5: {
6: DefaultContainerName = "Model";
7: }
8: public IObjectSet<Person> People
9: {
10:
11: get { return base.CreateObjectSet<Person>(); }
12:
13: }
14:
15: }
Caso você se pergunte onde está o IObjectSet de AcademicPerson vou lhe responder: Não podemos criar um Iobject set quando estamos trabalhando com classes derivadas. vamos obter as entidades derivadas usando o método OfType<T>().
4- DataContext
1: public class DataContext
2: {
3:
4: public static Model FactoryDataContext()
5: {
6: String connection = @"Data Source=.\SQLEXPRESS;Initial Catalog=EF4Inheritance;Integrated Security=SSPI;";
7: var builder = new ContextBuilder<Model>();
8: builder.Configurations.Add(new PersonConfiguration());
9: builder.Configurations.Add(new AcademicPersonConfiguration());
10:
11: return builder.Create(new SqlConnection(connection));
12: }
13:
14: public static void CreateDataBase()
15: {
16:
17: var ctx = FactoryDataContext();
18: if (ctx.DatabaseExists())
19: ctx.DeleteDatabase();
20: ctx.CreateDatabase();
21:
22: }
23:
24: }
5- Exemplo
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: DataLayer.DataContext.CreateDataBase();
6: var dbContext = DataContext.FactoryDataContext();
7:
8: //Criando uma entidade do tipo Person
9: var person1 = dbContext.CreateObject<Person>();
10: person1.Email = "higor@mail.com";
11: person1.Name = "higor";
12: dbContext.People.AddObject(person1);
13: dbContext.SaveChanges();
14:
15: // Criando uma entidade do tipo AcademicPerson
16: var academicperson1 = dbContext.CreateObject<AcademicPerson>();
17: academicperson1.Email = "carlos@mail.com";
18: academicperson1.Name = "carlos";
19: academicperson1.Enrolment = "123";
20: dbContext.People.AddObject(academicperson1);
21: dbContext.SaveChanges();
22:
23: //Exibindo todas as ~entidades do tipo Person
24: Console.WriteLine("People\n");
25: foreach (var person in dbContext.People)
26: Console.WriteLine("Name: " + person.Name + " Email:" + person.Email);
27:
28: Console.WriteLine("\n");
29: //Exibindo todas as en
30: Console.WriteLine("AcademicPeople\n");
31: foreach (var academicPerson in dbContext.People.OfType<AcademicPerson>())
32: Console.WriteLine("Name: " + academicPerson.Name + " Email:" + academicPerson.Email + " Enrolment" + academicPerson.Enrolment);
33:
34: Console.ReadKey();
35: }
36: }
fonte:
http://www.dotway.se/post/CodeOnly-Inheritance-e28093-TPH-and-MEF.aspx