EF4 исключение с отношениями - PullRequest
0 голосов
/ 13 октября 2011

У меня есть две сущности, и есть их POCO:

public class DocumentColumn
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual long? DocumentTypeId { get; set; }
}

public class DocumentType {
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
}

Существует связь между этими двумя сущностями. В БД отношение называется: FK_T_DOCUMENT_COLUMN_T_DOCUMENT_TYPE.

Когда я делаю:

DocumentColumns.Where(x => x.DocumentTypeId == documentTypeId).ToList();

Я получаю исключение:

{"Metadata information for the relationship 'MyModel.FK_T_DOCUMENT_COLUMN_T_DOCUMENT_TYPE' could not be retrieved. If mapping attributes are used, make sure that the EdmRelationshipAttribute for the relationship has been defined in the assembly.  When using convention-based mapping, metadata information for relationships between detached entities cannot be determined.\r\nParameter name: relationshipName"}

Я попытался удалить связь и таблицу DocumentColumn и перезагрузить их, но код все равно выдает исключение.

Когда это исключение означает и как я могу его решить?

EDIT:
Исключение случается также, если я делаю DocumentColumns.ToList();

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

(Предположим, вы говорите о Code First ....) Ни в одном классе нет информации, позволяющей CF знать, что между ними есть связь. Неважно, что в базе данных есть информация. Entity Framework должен иметь представление о взаимоотношениях. Вы предоставляете только свойство с целым числом. CF не может вывести отношения. У вас должно быть что-то в том или ином классе, которое предоставляет тип или другой. Это не база данных. Это данные модель . Совсем разные вещи.

Но это еще не все. Я предполагаю, что это отношения один ко многим. Вы можете поместить свойство List в класс Document или свойство Document в класс DocumentColumn. Если вы только делаете последнее, CF и EF НЕ будут знать о 1: . Он будет предполагать 1: 1 (то есть, если вы оставите здесь целое число DocumentId, в противном случае он будет предполагать 1: 0..1). Тем не менее, я думаю, что вы могли бы избежать этого, а затем просто настроить множественность (1: ) в свободном API.

ОБНОВЛЕНИЕ ... читая ваш вопрос еще раз, я думаю, что вы используете EDMX и дизайнер, а не код в первую очередь. Что вы используете для создания ваших классов POCO? Вы делаете Code Gen из EDMX или просто пишете классы. Я все еще думаю, что отсутствие свойства навигации по крайней мере в ОДНОМ из типов может быть причиной проблемы. Сообщение об ошибке не говорит о том, что ... я прихожу к такому выводу, только посмотрев на классы и поняв, как EF работает с метаданными. Я мог бы лаять не на то дерево. FWIW, я спросил команду, знакомы ли они с этим исключением, и может дать некоторое представление о том, какой шаблон будет его создавать. Это довольно странно. :)

1 голос
/ 13 октября 2011

Мне кажется странным, что вы используете EF с определенными отношениями и не используете связанное свойство. Вы не можете сделать:

DocumentColumns.Where(x=>x.DocumentType.Id == documentTypeId).ToList();

Это то, что я ожидал увидеть в этом случае.

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