Entity Framework -- 使用类别字段的实体继承关系

我们经常使用数据表中的类别字段来分辨所存记录的类型,在对象场景下,我们一般会将其演化为有继承关系的一组对象,以符合面向对象的设计和使用,那么我们在Entity Framework环境中如何来实现这样的实体关系呢?这里将通过一些例子,来说明一般场景下的使用方式。

场景一:数据表Peoples记录了一些人,每个人都有唯一的工作类别,在该场景下,我们需要按照工作类别来构建一组对象,使得人根据工作类别进行了分类。
首先创建数据表如图:

填充数据如下:

[假设我们只对人进行四种分类(演员、商人、程序员、运动员)]

现在我们使用VS2008从数据库创建PeopleModel.edmx模型,如图:

VS2008自动为我们创建了一个实体People,但是我们在这个场景下,需要有一个依据工作类别区分的对象层次,因此我们加入新的实体Actor(演员), Businessman(商人), Developer(程序员), Sporter(运动员) 他们都继承自People(创建实体时,指定其基类型为People), 如图:

创建后,我们得到了如下的模型:

现在,我们从People实体中删除JobCategory的映射,因为我们需要使用JobCategory来区别People的子类,而不是作为People的属性。设置People实体为抽象的(我们假设每一个人都有工作,呵呵)。

然后,使用VS2008中的"映射详细信息"视图,为每个子类设置其映射的表和条件。

每个子类都类似修改完毕后,我们的模型就大功告成了
1 <EntityType Name="Peoples">
2           <Key>
3             <PropertyRef Name="PeopleID" />
4           </Key>
5           <Property Name="PeopleID" Type="nvarchar" Nullable="false" MaxLength="50" />
6           <Property Name="PeopleName" Type="nvarchar" Nullable="false" MaxLength="50" />
7           <Property Name="JobCategory" Type="nvarchar" Nullable="false" MaxLength="50" StoreGeneratedPattern="Computed"/>
8         </EntityType>


下面我们就可以通过代码来验证我们的模型了。
ContractedBlock.gif ExpandedBlockStart.gif Code
class Program
    {
        
public static void Main(string[] args)
        {
            QueryDevelopers();
            Console.ReadLine();
        }

        
private static void QueryDevelopers()
        {
            
using (var context = new PeopleEntities())
            {
                var query 
= from c in context.Peoples
                            
where c is Developer
                            select c;
                
foreach(var c in query)
                {
                    Console.WriteLine(
"Actor Name : {0}", c.PeopleName);
                }

            }
        }
    }

class Program
    {
        
public static void Main(string[] args)
        {
            QueryDevelopers();
            Console.ReadLine();
        }

        
private static void QueryDevelopers()
        {
            
using (var context = new PeopleEntities())
            {
                var query 
= from c in context.Peoples
                            
where c is Developer
                            select c;
                
foreach(var c in query)
                {
                    Console.WriteLine(
"Actor Name : {0}", c.PeopleName);
                }

            }
        }
    }

转载于:https://www.cnblogs.com/crossingdawn/archive/2009/07/23/1529225.html

猜你喜欢

转载自blog.csdn.net/weixin_34090562/article/details/93409746