Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnModelCreating上的modelBuilder.Configurations.Add和modelBuilder.Entity_C#_Entity Framework 6 - Fatal编程技术网

C# OnModelCreating上的modelBuilder.Configurations.Add和modelBuilder.Entity

C# 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

我刚刚开始研究实体框架代码优先的方法,我在下面写了两种方法,两种方法都很好

请让我知道这两种方法背后的核心概念是什么,应该遵循什么

方法1:使用EntityTypeConfiguration

公共类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);