C# OnModelCreating上的modelBuilder.Configurations.Add和modelBuilder.Entity
我刚刚开始研究实体框架代码优先的方法,我在下面写了两种方法,两种方法都很好 请让我知道这两种方法背后的核心概念是什么,应该遵循什么 方法1:使用EntityTypeConfigurationC# OnModelCreating上的modelBuilder.Configurations.Add和modelBuilder.Entity,c#,entity-framework-6,C#,Entity Framework 6,我刚刚开始研究实体框架代码优先的方法,我在下面写了两种方法,两种方法都很好 请让我知道这两种方法背后的核心概念是什么,应该遵循什么 方法1:使用EntityTypeConfiguration 公共类BlogsMap:EntityTypeConfiguration { 公共BlogsMap(字符串模式) { ToTable(“博客”); HasKey(t=>t.BlogId); 属性(t=>t.BlogId); 属性(t=>t.Name); 属性(t=>t.Url); } } 公共类BlogCon
公共类BlogsMap:EntityTypeConfiguration
{
公共BlogsMap(字符串模式)
{
ToTable(“博客”);
HasKey(t=>t.BlogId);
属性(t=>t.BlogId);
属性(t=>t.Name);
属性(t=>t.Url);
}
}
公共类BlogContext:DbContext
{
公共博客上下文(字符串名称)
:base(名称)
{
}
公共IDbSet博客{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(newblogmap(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>();
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串名称{get;set;}
公共字符串Url{get;set;}
公共虚拟列表发布{get;set;}
}
公共类BloggingContext:DbContext
{
公共数据库集博客{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity();
}
}
请给我提供实体的概念/博客,因为我刚刚开始。您有几种方法来配置您的实体。下面我将展示三种方法,一种使用DataAnnotation,另一种使用FluentAPI 第一种变体是使用数据注释。您可以使用attributes()配置实体类和属性。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; }
}
2-使用Fluent Api的第二个变体是创建映射类(第一种方法)。这样,您可以在继承EntityTypeConfiguration
的类中配置实体:
添加配置的最佳方式如下:
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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
var typesToRegister=Assembly.getExecutionGassembly().GetTypes()
.Where(type=>!String.IsNullOrEmpty(type.Namespace))
.Where(type=>type.BaseType!=null&&type.BaseType.IsGenericType
&&type.BaseType.GetGenericTypeDefinition()==typeof(EntityTypeConfiguration));
foreach(TypeStoreRegister中的变量类型)
{
dynamic configurationInstance=Activator.CreateInstance(类型);
modelBuilder.Configurations.Add(configurationInstance);
}
基于模型创建(modelBuilder);
}
最后一种变体(第一种方法)对我来说是最好的,因为您不必接触模型类(添加属性)来指定所需的内容,并且如果要添加新实体或更改某些内容,它更灵活。string nspace=“CompanyAdministration.data.Models”;
string nspace = "CompanyAdministration.data.Models";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace && t.Name[0] != '<' && t.Name.Substring(0, 2) != "BOX" && t.Name != "CAContext"
select t;
foreach (Type t in q)
{
try
{
MethodInfo method = modelBuilder.GetType().GetMethod("Entity");
method = method.MakeGenericMethod(new Type[] { t });
method.Invoke(modelBuilder, null);
}
catch
{
}
}
base.OnModelCreating(modelBuilder);
var q=来自Assembly.getExecutionGassembly().GetTypes()中的t
其中t.IsClass&&t.Namespace==nspace&&t.Name[0]!='我有一些映射器,它们的构造函数有默认参数。必须更改以使用ImpromptuInterface库才能运行。foreach(typesToRegister中的var type){dynamic configurationInstance=Impromptu.InvokeConstructor(type);Serilog.Log.Debug(“{Method}为{TypeName}添加modelBuilder映射”,“OnModelCreating”,type.Name);modelBuilder.Configurations.Add(configurationInstance);}我正在将下面的代码转换成EF7,有没有办法重构这两行代码?显示配置。EF7 modelbulder中缺少Add。dynamic configurationInstance=Activator.CreateInstance(类型);modelBuilder.Configurations.Add(configurationInstance);感谢您在动态加载它们时提供的便利。我正要写点什么,就这么想了+1@phanf你找到办法了吗?空的试捕被认为是不好的做法。答案通常需要加上一些解释。
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);
}
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);
}
}
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);
}
string nspace = "CompanyAdministration.data.Models";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace && t.Name[0] != '<' && t.Name.Substring(0, 2) != "BOX" && t.Name != "CAContext"
select t;
foreach (Type t in q)
{
try
{
MethodInfo method = modelBuilder.GetType().GetMethod("Entity");
method = method.MakeGenericMethod(new Type[] { t });
method.Invoke(modelBuilder, null);
}
catch
{
}
}
base.OnModelCreating(modelBuilder);