2015-01-02 11 views
9

Daha önce, varlık çerçevesi kodu ilk yaklaşımı üzerinde çalışmaya başladım, aşağıda iki yaklaşım yazdım ve her ikisi de iyi çalışıyor.modelBuilder.Configurations.Add ve modelBuilder.Entity OnModelCreating

Lütfen bu iki yaklaşımın arkasındaki temel kavramların neler olduğunu ve nelerin takip edilmesi gerektiğini bana bildirin.

Yaklaşım 1: EntityTypeConfiguration

kullanma
public class BlogsMap : EntityTypeConfiguration<Blog> 
    { 
     public BlogsMap(string schema) 
     { 
      ToTable("BLOG"); 
      HasKey(t => t.BlogId); 
      Property(t => t.BlogId).HasColumnName("BLOGID"); 
      Property(t => t.Name).HasColumnName("NAME"); 
      Property(t => t.Url).HasColumnName("URL"); 
     } 

    } 


public class BlogContext : DbContext 
    { 
     public BlogContext(string name) 
      : base(name) 
     { 
     } 

     public IDbSet<Blog> BLOG { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Configurations.Add(new BlogMap(string.Empty)); 
     } 
    } 

Yaklaşım 2: ben sadece başlamıştır beri

public class Blog 
    { 
     public int BlogId { get; set; } 
     public string Name { get; set; } 
     public string Url { get; set; } 
     public virtual List<Post> Posts { get; set; } 
    } 


    public class BloggingContext : DbContext 
    {  

     public DbSet<Blog> Blogs { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Blog>(); 

     } 
    } 

, varlık bana kavram/bloglar verin.

cevap

25

Varlıklarınızı yapılandırmanın birkaç yolu vardır. Aşağıda, biri DataAnnotation kullanarak ve iki tanesi Fluent Api kullanarak üç şekilde göstereceğim.

İlk varyant DataAnnotations kullanıyor. Eğer varlık sınıfları ve properties.DataAnnotations yapılandırmak için (DataAnnotations) özelliklerini kullanmak geçersiz kılar varsayılan Kod İlk kuralları niteliklerini edebilirsiniz: bağlam sınıfında,

[Table(“BLOGS”)] 
public class Blog 
{ 
    [Key] 
    [Column(“BLOGID”)] 
    public int BlogId { get; set; } 
    [Column(“NAME”)] 
    public string Name { get; set; } 
    [Column(“URL”)] 
    public string Url { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 
[Table(“POSTS”)] 
public class Post 
{ 
    [Key] 
    [Column(“POSTID”)] 
    public int PostId { get; set; } 
    [Column(“TEXT”)] 
    public string Text { get; set; } 

    public int BlogId { get; set; } 

    [ForeignKey("BlogId")] 
    public virtual BaseCard Blog { get; set; } 
} 

Sonra OnModelCreating yöntemi geçersiz gerekmez, EF olacak oldukça basittir

public class BlogContext : DbContext 
{ 
    public BlogContext(string name) 
     : base(name) 
    { 
    } 

    public IDbSet<Blog> Blogs { get; set; } 
    public IDbSet<Post> Posts { get; set; } 
} 

Veri Açıklamalar ile yapılandırılması ve bunu aradığınız şey olabilir: senin varlıkları ve ilişkiyi eşlemek için özellik kullanmak (bu blog ve sonrası arasındaki 1-to-çok ilişki yaratacaktır) için. Ancak Veri Ek Açıklamaları yalnızca olası yapılandırmaların bir alt kümesine erişmenize izin verir (şimdiye kadar gördüğünüzden çok daha fazla olsa da). Bununla birlikte, Fluent API, daha da fazlasına erişmenizi sağlar, dolayısıyla bu nedenle tercih edebilirsiniz. Akıcı Api ile alanlarınızı ve varlık sınıflarınızın ilişkilerini eşlemek için öznitelikleri kullanmanız gerekmez. Akıcı kullanarak

public class BloggingContext : DbContext 
{  

    public DbSet<Blog> Blogs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Blog>().ToTable("BLOGS"); 

     modelBuilder.Entity<Blog>().HasKey(t => t.BlogId); 
     modelBuilder.Entity<Blog>().Property(t => t.BlogId).HasColumnName("BLOGID"); 
     modelBuilder.Entity<Blog>().Property(t => t.Name).HasColumnName("NAME"); 
     modelBuilder.Entity<Blog>().Property(t => t.Url).HasColumnName("URL"); 
     // The same with post 

     //mapping one-to-many relationship 
     modelBuilder.Entity<Post>().HasRequired(c => c.Blog) 
     .WithMany(s => s.Posts) 
     .HasForeignKey(c => c.BlogId); 

} 

2-İkinci varyant:

1-Haritalama sizin bağlamda OnModelCreating yöntemde varlıkları (alanlar ve ilişkiler) (Kişisel ikinci Yaklaşımı): Akıcı Api kullanmanın iki yolu vardır API, haritalama sınıfları yaratıyor (İlk Yaklaşımınız).

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

iyi yolu: Eğer OnModelCreating yönteminde bunları eklemeniz gerekir senin bağlamda eşleştirmeleri dahil etmek

public class BlogMap : EntityTypeConfiguration<Blog> 
{ 
    public BlogMap() 
    { 
     ToTable("BLOGS"); 
     HasKey(t => t.BlogId); 
     Property(t => t.BlogId).HasColumnName("BLOGID"); 
     Property(t => t.Name).HasColumnName("NAME"); 
     Property(t => t.Url).HasColumnName("URL"); 
    } 

} 

public class PostMap : EntityTypeConfiguration<Post> 
{ 
    public PostMap() 
    { 
     ToTable("POSTS"); 
     HasKey(t => t.PostId); 
     Property(t => t.Text).HasColumnName("TEXT"); 

     //mapping the relationship 
     HasRequired(c => c.Blog) 
     .WithMany(s => s.Posts) 
     .HasForeignKey(c => c.BlogId); 

    } 
} 

Sonra: Bu şekilde, EntityTypeConfiguration<TEntity> arasında miras sınıfları içinde Varlıkları yapılandırmak yapılandırmaları eklemek için bu şekilde yer almaktadır:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() 
     .Where(type => !String.IsNullOrEmpty(type.Namespace)) 
     .Where(type => type.BaseType != null && type.BaseType.IsGenericType 
      && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)); 
     foreach (var type in typesToRegister) 
     { 
      dynamic configurationInstance = Activator.CreateInstance(type); 
      modelBuilder.Configurations.Add(configurationInstance); 
     } 
     base.OnModelCreating(modelBuilder); 
} 

Bu son varyant (ilk yaklaşım) beni dokunmak gerekmez nedeniyle en iyisi için yo yeni bir varlık eklemek veya bir şeyi değiştirmek istiyorsanız, istediğinizi belirtmek için model sınıfları (öznitelikleri ekleme) ve daha esnektir.

+0

Yapıcıları için varsayılan parametreleri olan bazı haritalandırıcılarım vardı.Gitmek için ImpromptuInterface lib kullanmak için değiştirmek zorunda kaldı. foreach (typesToRegister türünde var) { dinamik yapılandırmaInstance = Impromptu.InvokeConstructor (type); Serilog.Log.Debug ("{Yöntem} {TypeName} için modelBuilder map", "OnModelCreating", type.Name); modelBuilder.Configurations.Add (configurationInstanceInstance); } – Jafin

+0

I <3 bu cevap. Benim için "favori" için bir yol var mı? Ben geri dönebilirim lol ... – mmcrae

+0

Benim tek sorum, harita kodunu senin bölüm 2 nereye koyarsın? Ayrı bir Google Haritalar klasörü oluşturuyor ve ilgili kodu içerecek şekilde ayrı bir BlogMaps ve PostMaps dosyaları oluşturuyorsunuz, FluentValidation ile nasıl yaptığınıza benzer? –

İlgili konular