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

时间:2023-03-09 00:52:24
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; }
}

[文档目录]