gpt4 book ai didi

c# - modelBuilder.Configurations.Add 和 modelBuilder.Entity onModelCreating

转载 作者:可可西里 更新时间:2023-11-01 08:15:29 26 4
gpt4 key购买 nike

我刚刚开始研究 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));
}
}

方法二:

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

}
}

请提供关于实体的概念/博客,因为我刚刚开始。

最佳答案

您有多种方式来配置您的实体。下面我将展示三种方式,一种使用 DataAnnotations,另一种使用 Fluent Api。

第一个变体是使用 DataAnnotations。您可以使用属性 ( DataAnnotations ) 来配置您的实体类和属性。DataAnnotations 属性会覆盖默认的 Code First 约定:

[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 将使用该属性来映射您的实体和关系(它将在博客和帖子之间创建一对多关系):

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

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

使用数据注释进行配置非常简单,它可能正是您正在寻找的。但是数据注释只允许您访问可能配置的一个子集(尽管比您目前看到的要多得多)。 Fluent API , 但是,它使您可以访问更多内容,因此您可能会因此而更喜欢它。使用 Fluent Api,您无需使用属性来映射实体类的字段和关系。 Fluent Api 有两种使用方式:

1-映射 OnModelCreating 中的实体(字段和关系)您上下文中的方法(您的第二个方法):

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

这最后一个变体(第一种方法)对我来说是最好的,因为你不必触及你的模型类(添加属性)来指定你想要的东西,如果你想添加一个新的实体或改变一些东西。

关于c# - modelBuilder.Configurations.Add 和 modelBuilder.Entity onModelCreating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com