Сценарий разделения сущностей в реализации кода EF4 CTP5 с первым кодом

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

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

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

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

Две таблицы, связанные с сущностью пользователя, таковы:

Клиенты

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

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

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

Райан


person RockyMountainHigh    schedule 17.03.2011    source источник
comment
Может ли User.CustomerString быть строкой только для чтения?   -  person anon    schedule 18.03.2011


Ответы (1)


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

person Ladislav Mrnka    schedule 17.03.2011
comment
Я действительно заметил, что 4.1 был выпущен после того, как я опубликовал это. - person RockyMountainHigh; 18.03.2011
comment
Я не совсем понимаю ваш комментарий о том, что это не сущность, потому что пользователь не содержит всех полей из обеих таблиц. Действительно ли это требование сущности в EF? Кажется, что цель моделирования данных в соответствии с вашими бизнес-объектами сразу же побеждает. как часто таблицы БД частично или полностью отражают ваши бизнес-объекты? обычно они состоят из данных, извлеченных из разных таблиц, но обычно не из всех. (подумайте о создании/изменении дат или pks в справочных таблицах.) - person RockyMountainHigh; 18.03.2011
comment
@Rocky: проблема в том, что ваш пользовательский класс не содержит всех столбцов, не допускающих значение NULL, из сопоставленных таблиц. Таким образом, ваше приложение никогда не сможет вставить пользователя. - person Ladislav Mrnka; 18.03.2011
comment
А, я понимаю, что вы говорите. Мне все еще любопытно, является ли это требованием, несмотря на то, что это служба только для чтения, и никакие обновления/вставки/удаления никогда не будут выполняться для этой модели? Спасибо за отличный отзыв! - person RockyMountainHigh; 18.03.2011