EntityFrameWorkCore(1)-实体类型

一般情况下我们在数据库中注册实体 都是通过 添加属性DbSet 来实现的,如下

class MyContext : DbContext
{
    public DbSet Blogs { get; set; }

}

实际上,们还有别的办法添加

1.泛型属性DbSet,这个就不说了,上面的代码就是。

2.通过导航属性,看下面的代码,Post被包含了,为什么呢?是因为。包含 Post 是因为它是通过 Blog.Posts 导航属性发现的。

class MyContext : DbContext
{
    public DbSet Blogs { get; set; }

}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

3.通过模型构建器添加,这种什么时候用呢?这种多用于 动态数据库或者插件框架中。这样可以完美的避免开手动修改数据库DbContext。

class MyContext : DbContext
{

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity();
    }
}

public class AuditEntry
{
    public int AuditEntryId { get; set; }
    public string Username { get; set; }
    public string Action { get; set; }
}

不小心多加了怎么办?,当然还有办法手动排除掉。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore();
}

 你也可以通过添加特性[NotMapped]排除

[NotMapped]
public class BlogMetadata
{
    public DateTime LoadedFromDatabase { get; set; }
}

如何手动指定表名称?

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .ToTable("blogs");
}

 或者通过添加特性

[Table("blogs")]
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

个人推荐使用扩展方法而不是特性。特性有很大的局限性就是表名称是个常量。不可变的。

如何指定数据表架构

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .ToTable("blogs", schema: "blogging");
}

或者使用

[Table("blogs", Schema = "blogging")]
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

很明显表比较多的时候写起来比较头疼,所以你可以指定一个默认架构,也就有了下面的代码

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("blogging");
}

 

你可能感兴趣的:(EntityFrameWork,实体类型)