в 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);
}
этот последний вариант (первый подход) для меня является лучшим из-за того, что вам не нужно прикасаться к классам моделей (добавление атрибутов), чтобы указать, что вы хотите, и является более гибким, если вы хотите добавить новый объект или что-то изменить.