Mego开发文档 - 建模高级主题

Posted CarefreeXT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mego开发文档 - 建模高级主题相关的知识,希望对你有一定的参考价值。

建模高级主题

在建模过程中我们还有许多其他情况,这里列出本框架中的有用特性来用于解决此类问题。

函数映射

我们可以将指定的CLR函数映射到数据库中的系统函数或自定义函数,该特性用于补充框架中未提供的数据库函数交互。

public class OrderManageEntities : DbContext
{
    public OrderManageEntities(string name)
        : base(name)
    { }

    [DbFunction("GetSno")]
    public int GetSno()
    {
        throw new NotImplementedException();
    }
}

通常我们会在LINQ表达式中使用这些函数,框架会将其应用到所提交的SQL语句中。

继承

我们与EF同样支持数据对象继承,在继承的数据对象中一条数据会被垂直分割成多个表存储,在使用过程中框架会透明化这一组装过程。例如下面代码所示,创建一组有继承关系的数据对象:

public class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<RssBlog> RssBlogs { get; set; }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}
[Table(nameof(RssBlog), true)]
public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}

关系

关系就是指对象中的复杂对象或集合属性,本框架与EF中的关系是有区别的。EF中强调关系的成对出现,这是由于数据库关系的思想决定的。然而Mego更接近与对象化逻辑,我们只关心当前对象中某个对象或集合属性所关联的对象,以及这两个对象建立关系的主外键,因此在Mego中没有EF中的一对一,一对多,多对多的关系的概念,我们使用三种数据注释来描述所有的关系。

1. 情况一

通常两个数据对象的关系是A对象中记录了B对象的主键,这时就可以在A对象建立一个对象属性指向B对象。

public class OrderDetail
{
    public int Id { get; set; }

    public int OrderId { get; set; }

    [ForeignKey("OrderId", "Id")]
    public virtual Order Order { get; set; }
}

2. 情况二

通常两个数据对象的关系是B对象中记录了A对象的主键,这时就可以在A对象建立一个集合属性指向B对象。

public class Order
{
    public int Id { get; set; }
    
    [InverseProperty("OrderId", "Id")]
    public virtual ICollection<OrderDetail> Details { get; set; }
}

3. 情况三

这种情况是为了应对更复杂的情况,它有别于上面两种情况,A对象和B对象在逻辑上有关系,但是在数据层面是没有任何关联,他们的关系被存储在第三个C对象中,例如下面的代码示例:

public class Order
{
    public int Id { get; set; }
    
    [Relationship(typeof(OrderDetail), "OrderId", "Id", "ProductId", "Id")]
    public virtual ICollection<Product> Products { get; set; }
}

以上是关于Mego开发文档 - 建模高级主题的主要内容,如果未能解决你的问题,请参考以下文章

Mego开发文档 - 数据库建模

Mego开发文档 - 复杂查询

Mego开发文档 - 快速概述

Mego开发文档 - 基础查询

Mego开发文档 - 快速开始

Mego开发文档 - 基本保存操作