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.
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
I <3 bu cevap. Benim için "favori" için bir yol var mı? Ben geri dönebilirim lol ... – mmcrae
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? –