设为首页 加入收藏

TOP

asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)(一)
2019-09-17 18:01:59 】 浏览:40
Tags:asp.net core 系列 模型 配置 字段 构造 函数 拥有 实体 类型

一. 支持字段

         EF允许读取或写入字段而不是一个属性。在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用。无法使用数据注释配置。除了约定,还可以使用Fluent API为属性配置支持字段。

  1.1 约定

public class Blog
{
   // _<camel-cased property name>
    private string _url;

    public int BlogId { get; set; }

    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }
}

  1.2 Fluent API

modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .HasField("_validatedUrl");

public class Blog
{
    private string _validatedUrl;
   
    public string Url
    {
        get { return _validatedUrl; }
    }

    public void SetUrl(string url)
    {
       //...
        _validatedUrl = url;
    }
}

 

二. 构造函数

  从开始 EF Core 2.1,可以定义带参数的构造函数,并在创建实体实例时让EF Core调用此构造函数。构造函数参数可以绑定到映射属性,或绑定到各种服务,以方便延迟加载等行为。

  2.1  带参的构造函数

    下面代码演示带参数的构造函数,并且设置只读属性,外部调用该类时,只能通过构造函数传入实体值。

public class Blog
{
    public Blog(int id, string name, string author)
    {
        Id = id;
        Name = name;
        Author = author;
    }

    public int Id { get; private set; }

    public string Name { get; private set; }
    public string Author { get; private set; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

    别外使用私有setter的另一种方法是使属性真正只读,并在OnModelCreating中添加更明确的映射。

public class Blog
{
    private int _id;

    public Blog(string name, string author)
    {
        Name = name;
        Author = author;
    }

    public string Name { get; }
    public string Author { get; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>(
        b =>
        {
            b.HasKey("_id");
            b.Property(e => e.Author);
            b.Property(e => e.Name);
        });
}

  

  2.2 注入服务

    EF Core还可以将“服务”注入实体类型的构造函数中。例如,可以注入以下内容:

           DbContext - 当前上下文实例,也可以作为派生的DbContext类型键入

           ILazyLoader- 延迟加载服务

           Action<object, string>- 一个延迟加载的委托

           IEntityType - 与此实体类型关联的EF Core元数据

    例如,注入的DbContext可用于选择性地访问数据库以获得关于相关实体的信息而无需全部加载它们。在下面的示例中,这用于获取Blog博客中的Posts帖子数量:

public class Blog
{
    public Blog()
    {
    }

    private Blog(BloggingContext context)
    {
        Context = context;
    }

    private BloggingContext Context { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }

    public ICollection<Post> Posts { get; set; }

    //获取帖子数量
    public int PostsCount
        => Posts?.Count
           ?? Context?.Set<Post>().Count(p => Id == EF.Property<int?>(p, "BlogId"))
           ?? 0;
}

     有一些需要注意:

           (1)构造函数是私有的,因为它只由EF Core调用,并且还有另一个通用的公共构造函数。

      (2)使用注入服务的代码(即EF上下文)防御它为null,处理EF Core未创建实例的情况。

      (3)因为服务存储在读或写属性中,所以当实体附加到新的上下文实例时,它将被重置。

    2.2示例演示,没有成功,Blog带参的构造函数为私有,无法调用, context上下文总为null,以后在了解。

 三.拥有的实体类型

   该功能是在 EF Core 2.0 中的新增功能。是指:当一个实体类中包含导航属性(实体类型引用属性),并对导航属性进行建模,这个导航属性类被称为“拥有实体类型”。而包含“拥有实体类型”的类叫:所有者。

 

   3.1 显示配置

     EF Core中的所有实体类型永远不会按照约定包含在模型中。可以使用OwnsOne在(使用EF Core 2.1中的新增功能)OnModelCreating中使用或用注释类型OwnedAttribute将类型配置为拥有类型。

     下面示例中StreetAddress是一个没有标识属性的类型。 它用作 Order 类型的属性来指定特定订单的发货地址。

//拥有实体类型
 [Owned]
public class Str
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇微服务框架surging学习之路——序.. 下一篇从前后端项目工程化谈起

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目