в modelbuilder.Настойки.Добавить и modelBuilder.Объект на OnModelCreating

Я только начал работать над первым подходом к коду entity framework, я написал два подхода ниже, и оба работают нормально.

пожалуйста, дайте мне знать, каковы основные концепции обоих этих подходов, и что должно последовать?

подход 1 : Использование EntityTypeConfiguration

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));
        }
    }

подход 2 :

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>();

        }
    }

пожалуйста, предоставьте мне концепцию / Блоги на entity, так как я только что начатый.

1 ответов


у вас есть несколько способов настройки ваших сущностей. Ниже я покажу три способа: один с использованием DataAnnotations и два с использованием Fluent Api.

первый вариант использует DataAnnotations. Можно использовать атрибуты (DataAnnotations) для настройки классов сущностей и свойств.Атрибуты DataAnnotations переопределяют первые соглашения кода по умолчанию:

[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; }
}

тогда в вашем классе контекста вам не нужно переопределять метод OnModelCreating, EF будет используйте атрибут для сопоставления ваших сущностей и отношений (он создаст отношение 1 ко многим между блогом и сообщением):

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

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

настройка с аннотациями данных довольно проста, и это может быть именно то, что вы ищете. Но аннотации данных позволяют получить доступ только к подмножеству возможных конфигураций (хотя гораздо больше, чем вы видели до сих пор). The свободно API, однако, дает вам доступ к еще большему, поэтому вы можете предпочесть его по этой причине. С Свободно Api вам не нужно использовать атрибуты для сопоставления полей и отношений классов сущностей. Существует два способа использования Fluent Api:

1-отображение сущностей (полей и отношений) в OnModelCreating метод в вашем контексте (ваш второй Aproach):

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-второй вариант использования Fluent Api-это создание классов отображения (ваш первый подход). Таким образом, Вы настраиваете свои сущности в классах, которые наследуют EntityTypeConfiguration<TEntity>:

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);

    }
}

затем, чтобы включите сопоставления в свой контекст, который вам нужно добавить в OnModelCreating способ:

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

лучший способ добавить конфигурации заключается в следующем:

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);  
}

этот последний вариант (первый подход) для меня является лучшим из-за того, что вам не нужно прикасаться к классам моделей (добавление атрибутов), чтобы указать, что вы хотите, и является более гибким, если вы хотите добавить новый объект или что-то изменить.