Сценарий разделения сущностей в реализации кода EF4 CTP5 - PullRequest
0 голосов
/ 17 марта 2011

Я думаю, что я на самом деле ищу разделение сущностей. Однако я не уверен на 100%, поддерживается ли способ, который мне нужен. Итак, я добавлю много подробностей, которые, надеюсь, помогут. Я ограничу область действия одной сущностью, поскольку ответ будет одинаковым для всех тех, с кем мне приходится иметь дело.

Итак, у меня есть объект User:

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

Из-за мультитенантности нашей базы данных каждый объект связан с концепцией владельца. Это представлено CustID во всех таблицах. Тем не менее, этот идентификатор является бессмысленным PK для наших клиентов, которые будут получать доступ к этой службе данных. Они знают свою CustomerString, которая является просто уникальным строковым значением, равным идентификатору в нашей таблице Client.

Две таблицы, связанные с сущностью 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. Из того, что я прочитал, мне кажется, что это не было бы проблемой, если бы идентификаторы были одинаковыми в каждой таблице. Однако, как вы видите, это не так.

Пожалуйста, помогите! Это абсолютное требование для этого проекта, над которым я работал в прошлом месяце или около того.

Заранее благодарю за любую помощь, которую вы можете оказать!

Ryan

1 Ответ

1 голос
/ 18 марта 2011

Я думаю, что это невозможно. Первая проблема заключается в том, что EF не может использовать уникальные ключи (вероятно, будет доступно в следующей основной версии ). Таким образом, вы не можете применить соотношение 1: 1 между Customer-> Id и User-> CustId (которое требует ограничения уникального ключа). Чтобы включить отношение 1: 1 в EF, субъекты должны «совместно использовать» PK. Это означает, что вы можете создать отношение 1: 1 только для Customer-> Id и User-> Id, которое вам явно не нужно.

Вторая проблема заключается в том, что полученный класс 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 был передан два дня назад .

...