obase社区Obase开发者QQ群:962698871
obase

欢迎查阅
OBASE帮助文档

对于关联引用对象,我们之前在新手进阶一节中已经已经讲过,就是访问某个对象的关联对象,这里我们就以新手进阶中学生和班级的关系为例: 关联引用的加载,使用如下的代码即可加载关联的另一端:

//对像上下文
var context = new StudentAndClassContext();
//查询班级
var cla = context.Classes.FirstOrDefault();
if (cla != null)
    foreach (var student in cla.Students)
    {
        Console.WriteLine($"{student.StudentId}号学生,名字是:{student.Name}");
    }

就像普通的调用对象内引用的其他对象一样,就可以获得引用对象。 这里实际上是使用了延迟加载,在查询对象时,他的关联对象引用其实并不是在查询中被一并查出的,Obase默认的配置是在你访问这个属性访问器的时候额外进行一次查询并构造相应的关联对象,上述例子即是使用延迟加载的。对于需要延迟加载的关联引用,我们会将其定义为virtual的,就如上文中的Class中Students一样。有些时候,比如对性能比较敏感时(延迟加载需要额外访问数据持久层),我们会关闭掉延迟加载或将其不定以为virtual的,但如果仍需要查询出关联对象的话则可以用Include方法强制包含关联引用,就可以直接获得对象和他的关联对象。

/// <summary>
///     学生与班级对象上下文
/// </summary>
public class StudentAndClassNoLazyLoadContext : ObjectContext<StudentAndClassNoLazyLoadConfger>
{
    /// <summary>
    ///     学生对象集合
    /// </summary>
    public ObjectSet<Student> Students { get; set; }

    /// <summary>
    ///     班级对象集合
    /// </summary>
    public ObjectSet<Class> Classes { get; set; }
}

/// <summary>
///     学生与班级对象上下文配置提供者
/// </summary>
public class StudentAndClassNoLazyLoadConfger : SqlContexConfiger
{
    /// <summary>
    ///     获取特定于数据库服务器(SQL Server、Oracle等)的数据提供程序工厂
    /// </summary>
    protected override DbProviderFactory DbProviderFactory => MySqlClientFactory.Instance;

    /// <summary>
    ///     连接字符串
    /// </summary>
    protected override string ConnectionString =>
        "server=127.0.0.1;database=obasedemo;uid=root;pwd=Sql*2008;pooling=false;CharSet=utf8;port=3306;SslMode=none;";

    /// <summary>
    ///     使用指定的建模器创建对象数据模型。
    /// </summary>
    /// <param name="modelBuilder"></param>
    protected override void CreateModel(ModelBuilder modelBuilder)
    {
        var classConfiguration = modelBuilder.Entity<Class>();
        modelBuilder.Entity<Student>();

        var studentClassAss = modelBuilder.Association<Student, Class>();
        studentClassAss.ToTable("Student");

        classConfiguration.AssociationReference<Student, Class>("Students", true).HasEnableLazyLoading(false);
    }
}

这里将关联引用配置为不延迟加载,所以需要使用Include方法进行加载。

//对像上下文
var context = new StudentAndClassNoLazyLoadContext();
//查询班级
var cla = context.Classes.FirstOrDefault();

var stu = cla?.Students;
if (stu == null || cla.Students.Count == 0)
{
    Console.WriteLine("No Load Association!");
}

//强制包含
cla = context.Classes.Include(p => p.Students).FirstOrDefault();

stu = cla?.Students;
if (stu != null)
{
    foreach (var student in cla.Students)
    {
        Console.WriteLine($"{student.StudentId}号学生,名字是:{student.Name}");
    }
}

没有找到您需要的文档?

您还可以通过人工服务在线咨询,服务时间为每天上午9点至下午6点。

If you can't find required answer, get in touch with us online. We provide service from 9:00 to 18:00.

让编程成为一件快乐的事
现在开始