EF4 CTP5代码优先实现中的实体拆分方案

时间:2011-03-17 17:28:07

标签: c#-4.0 entity-framework-4 entity-framework-ctp5

我认为我正在寻找的实际上是实体分裂。但是,我不是100%确定是否支持我需要的方式。因此,我将添加大量详细信息,希望能有所帮助。我将范围限制在一个实体,因为我必须处理的所有问题的答案都是相同的。

所以,我有一个用户实体:

User
ID (int)
CustID (int)
CustomerString (string)
FirstName (string)
LastName (string)
Email (string)

由于我们数据库的多租户,每个对象都有一个所有者的概念。这由所有表中的CustID表示。但是,对于将访问此数据服务的客户而言,此ID是无意义的PK。他们知道他们的CustomerString,它只是一个唯一的字符串值,相当于我们的Client表中的ID。

与User实体相关的两个表是这样的:

客户

CREATE TABLE [Customers](
 [ID] [int] NOT NULL,
 [Name] [varchar](100) NOT NULL,
 [Description] [varchar](255) NULL,
 [ClientPhone] [varchar](20) NULL,
 [Address] [varchar](255) NULL,
 [CustomerString] [varchar](100) NOT NULL,
 [sys_CreateDate] [datetime] NOT NULL,
 [sys_LastUpdate] [datetime] NOT NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY NONCLUSTERED 
(
 [ID] ASC
)

用户

CREATE TABLE [Users](
 [UserID] [int] IDENTITY(2000000,1) NOT NULL,
 [CustID] [int] NOT NULL,
 [FirstName] [varchar](40) NOT NULL,
 [LastName] [varchar](40) NOT NULL,
 [mail] [varchar](255) NULL,
 [CreateDate] [datetime] NOT NULL,
 [ModifyDate] [datetime] NOT NULL,
 CONSTRAINT [PK2_Users] PRIMARY KEY CLUSTERED 
(
 [UserID] ASC
)

因此,目前,我将User实体映射到Users表,如下所示:

ID  ==> Users.UserID
CustID ==> Users.CustID
CustomerString <NOT MAPPED>
FirstName ==> Users.FirstName
LastName ==> Users.LastName
Email ==> Users.Mail

现在,这是我的关键点。我需要将CustomerString映射到Customers.CustomerString,其中Users.CustID = Customers.ID。根据我的阅读,在我看来,如果在每个表中ID被命名为相同,那么这不会成为问题。但是,正如您所看到的,情况并非如此。

请帮忙!这是我在过去一个月左右的工作中对这个项目的绝对要求。

提前感谢您提供的任何帮助!

赖安

1 个答案:

答案 0 :(得分:1)

我认为这是不可能的。拳头问题是EF无法使用唯一键(可能是available in next major version)。因此,您无法在Customer-&gt; Id和User-&gt; CustId(需要唯一键约束)之间强制执行1:1关系。要在EF中启用1:1关系,实体必须“共享”PK。这意味着您只能在Customer-&gt; Id和User-&gt; Id上创建1:1关系,这显然是您不想要的。

第二个问题是生成的User类不是实体。它不包含两个类中的所有列。这是这两个实体的预测。您可以使用这两个实体并创建自定义linq查询以获得对此只读类的投影,如:

var query = from u in context.Users
            join c in context.Customers on u.CustId equals c.Id
            select new UserProjection
              {
                Id = u.Id,
                CustId = c.Id,
                CustomerString = c.CustomerString,
                FirstName = u.FistName,
                LastName = u.LastName
                Email = u.Mail
              }; 

另请注意,CTP5已经过时。 EF 4.1 RC为relased two days ago

相关问题