Skip to main content

配置实体

什么是实体类型

在面向对象的软件工程中,我们使用对象来描绘现实世界中的事物。例如,现实世界中的汽车在对象系统中体现为“汽车”对象。类是对同一类对象的抽象表示,它精炼地表达了这类对象的共同特征,而忽略非必要的细节。以“汽车”这一词汇为例,它便精准地概括了这类对象的本质特性,那就是承载人或物品进行空间移动的能力。Obase 框架引入了“实体型”这一概念,用于描述面向对象模型中的类(不包括关联类)。

特别说明

为什么不直接使用“类”而使用“实体型”这个概念呢?在面向对象模型中,普通的类和关联类都被称为“类”,这可能导致概念混淆。而在 ER 模型中,“实体”被用来指称现实中的事物,Obase 借用了这一概念。 那么,为什么不称为“实体类”而是“实体型”呢?这是因为在 Obase 中,它只关注类的数据结构,而并不关注行为。“型”代表的是类型,它主要指代的是数据结构。这样,“实体型”就强调了它是一种定义了数据结构的类型,而不仅仅是具有行为的类。

在上下文中包含一种类型的 ObjectSet 意味着它包含在 Obase 的模型中;我们通常将此类类型称为实体。 Obase 可以从/向数据库中读取和写入实体实例,如果使用的是关系数据库,Obase 可以自己为实体创建表。

在上下文中包含类型

按照约定,上下文的 DbSet 属性中公开的类型作为实体包含在模型中。 还包括在 CreateModel 方法中指定的实体类型,以及通过递归探索其他发现的实体类型的导航属性找到的任何类型。

下面的代码示例中包含了 Student 类型:

 public class MyDbContext : ObjectContext
{
public ObjectSet<Student> Students { get; set; }
}

public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}

忽略某个属性

如果不希望在模型中包含某一类型,则可以排除它:

public class Student{
public int UserId { get; set; }
public string Username { get; set; }
[Ignore]
public string Address {get;set;}
}

表名称

按照约定,每个实体类型都将设置为映射到与公开实体的 ObjectSet 属性名称相同的数据库表。 同时也可以手动配置表名。

[Entity(tableName:"Student")]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}

主键

[Entity(keyAttributes:"UserId")]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}
tip

如果需要设置多个主键的话,只需要调用多次 HasKeyAttribute 方法即可或者 keyAttributes 传入一个集合。

[Entity(keyAttributes:new string[] { "UserId","UserId1" })]
public class Student{
public int UserId { get; set; }
public int UserId1 { get; set; }
public string Username { get; set; }
}

主键自增

[Entity(isSelfIncrease:true]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}

显式关联型标注属性

[Association]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}
tip

Association有个额外的参数,支持设置显示关联的同时设置表名,如:Association("Students")

复杂类型标注属性

[Complex]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}
提示

详细的变更通知将会在后续的更改通知章节中进行说明。