我认为我正在寻找的实际上是实体分裂。但是,我不是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被命名为相同,那么这不会成为问题。但是,正如您所看到的,情况并非如此。
请帮忙!这是我在过去一个月左右的工作中对这个项目的绝对要求。
提前感谢您提供的任何帮助!
赖安
答案 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。