Entity Framework - Различная множественность в SSDL и CSDL - PullRequest
2 голосов
/ 18 декабря 2009

Я использую EF v1. У меня есть следующие таблицы:

CREATE TABLE category ( 
  category_id    int , 
  category_name  varchar(100) not null,
 CONSTRAINT PRIMARY KEY  (category_id)
 )

CREATE TABLE categoryDetails ( 
  detail_id    int, 
  category_desc varchar(100) not null,
  category_id    int  NOT NULL, 
 CONSTRAINT PRIMARY KEY  (detail_id),
 CONSTRAINT FOREIGN KEY (category_id) REFERENCES category(category_id) 
 )

В категории можно указать 0..1 categoryDetails.

В модели EF, сгенерированной из вышеуказанной базы данных, EF моделирует отношения как * как в SSDL, так и в CSDL. Используя конструктор CSDL, я могу изменить отношение / ассоциацию на 0..1 с *. Но при проверке SSDL он остается как *. При изменении на 0..1 в SSDL я получаю ошибку:

"Multiplicity is not valid in Role R111 in relationship RL111. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *."

Подскажите пожалуйста, как поменять SSDL?

В этом случае (0..1 в CSDL и * в SSDL) для кода создаются частичные классы в соответствии с отношением 0..1 (т. Е. Одно ссылочное свойство в каждом классе, содержащее тип другого класса - сбор не участвует). При запуске кода он работает без ошибок. Правильно ли это (разная множественность в SSDL и CSDL)?

Для случаев, когда структура таблицы НЕ может быть изменена, каково решение для получения связи 0..1?

Спасибо.

1 Ответ

4 голосов
/ 18 декабря 2009

Сегодня EF не рассуждает об уникальности, кроме как для колонок PK. Это означает, что у вас не может быть 0..1 в SSDL, если FK также не является PK, потому что в отношении EF ничто в базе данных не «навязывает» ограничение количества элементов.

т.е. EF не знает об ограничениях уникальности, поэтому не верит вам!

Однако, как вы обнаружили, вы можете сузить количество элементов в CSDL до 0..1, даже если в SSDL оно все еще равно *.

А поскольку EF обеспечивает семантику на основе CSDL, это должно работать просто отлично.

т.е. этот код (с 0..1 в CSDL и * в SSDL):

var category = ctx.Category.Include("Details").First(c => c.ID = 1);
var oldDetails = category.Details;
category.Details = new CategoryDetails {....};
ctx.SaveChanges();

попытается удалить oldDetails.

ПРЕДУПРЕЖДЕНИЕ: в EF 4.0 существует другой тип ассоциации (называемый ФК ассоциаций ) и в отличие от независимые ассоциации (т.е. тип поддерживается 3.5) вы не можете сузить мощность ФК ассоциация в CSDL.

Надеюсь, это поможет

Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...