Entity Framework: откуда, черт возьми, эти столбцы? - PullRequest
7 голосов
/ 24 ноября 2011

Мы пытаемся заставить Entity Framework работать в нашем магазине с существующей базой данных (и, следовательно, изменение схемы базы данных НЕ является опцией), и модульные тесты, которые мы создали для тестирования, показывают действительно странное поведение.

Это SQL-код, который он выделяет для конкретного имеющегося у нас объекта:

SELECT 
[Extent1].[CommentTypeId] AS [CommentTypeId], 
[Extent1].[DataPartId] AS [DataPartId], 
[Extent1].[CommentId] AS [CommentId], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Message] AS [Message], 
[Extent1].[From] AS [From], 
[Extent1].[Likes] AS [Likes], 
[Extent1].[SourceTypeId] AS [SourceTypeId], 
[Extent1].[StatusMessage_DataPartId] AS [StatusMessage_DataPartId], 
[Extent1].[Album_DataPartId] AS [Album_DataPartId]
FROM [dbo].[Comments] AS [Extent1]

Последние два запрошенных столбца, как вы могли заметить, не похожи на остальные.Это потому, что они на самом деле не существуют, и мы понятия не имеем, почему Entity запрашивает их!Ни наши файлы конфигурации, ни наши POCO вообще не упоминают о них.На самом деле, что касается нашей базы данных, они являются совершенно отдельными понятиями и не имеют прямого отношения вообще.

Откуда они получают эти столбцы и как мне сказать, чтобы они вырезали?

РЕДАКТИРОВАТЬ: Чтобы ответить на некоторые из вопросов ниже, 1) Мы используем Entity Framework 4.2.Мы используем свободное отображение.

2) Сам POCO выглядит следующим образом, для краткости вырезан беспорядок равенства:

public long DataPartId { get; set; }
public string CommentId { get; set; }
public DateTime? CreatedTime { get; set; }
public string Message { get; set; }
public string From { get; set; }
public int? Likes { get; set; }
public string SourceTypeId { get; set; }
public int CommentTypeId { get; set; }

public virtual DataPart DataPart { get; set; }
public virtual CommentType CommentType { get; set; }

3) Мы не используем edmx.У нас есть собственный DbContext.Не так много строк, которые ужасно интересны.Эти два, вероятно, представляют интерес:

    Configuration.LazyLoadingEnabled = true;
    Configuration.ProxyCreationEnabled = true;

Помимо этого, файл контекста содержит множество

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

и

public IDbSet<WhateverPoco> PocoDatabaseTableAccessor { get; set; }

4) Мы начали сdb-first, но это не сработало, поэтому в настоящее время мы выполняем code-first.

5) Это кишки конфигурации для этого конкретного POCO:

    HasRequired (x => x.DataPart)
        .WithRequiredDependent (x => x.Comment);

    HasRequired (x => x.CommentType)
        .WithMany (x => x.Comments)
        .HasForeignKey (x => x.CommentTypeId);

    HasKey (x => x.DataPartId);
    ToTable ("Comments", "dbo");

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

Проблема не в отображении или классе, который вы показали.Проверьте свои Album и StatusMessage классы.Они сущности?Они сопоставлены?Есть ли у них свойства навигации коллекции к комментариям?Если да, EF ожидает, что Comment должен иметь FK для этих таблиц.Если в таблице нет такого столбца, эти свойства навигации не могут быть сопоставлены в этих объектах.

Кстати.Не должен ли идентификатор в таблице Comments быть CommentId вместо DataPartId?

1 голос
/ 24 ноября 2011

Entity Framework, как и MVC, использует много соглашений по конфигурации.Это означает, что он предполагает определенные вещи, если вы не скажете этого не делать.

Однако, что-то действительно странное здесь, на основе предоставленной вами информации.Согласно SQL-запросу, это происходит из таблицы комментариев, однако ваше беглое отображение говорит, что DataPartId является первичным ключом.У вас есть дополнительные сопоставления беглого первичного ключа?Если нет, ваши отображения могут быть неправильными.Вы проверили фактическую сгенерированную базу данных, чтобы увидеть, соответствует ли модель данных тому, что вы пытаетесь сделать?

Я предполагаю, что ваши классы StatusMessage и Album имеют навигационные свойства для Comment, но так как вы определили DataPartId только какваш первичный ключ, то есть значение, которое он использует для поиска комментариев, а не CommentId.

0 голосов
/ 24 ноября 2011

Откройте .edmx в XML-редакторе и найдите эти столбцы. Они должны быть где-то в вашей модели.

РЕДАКТИРОВАТЬ: в исходном вопросе не упоминалось, что вы сначала используете код. Интересно, какая у вас проблема с базой данных, которая обычно хорошо работает? Сначала с помощью кода или модели вы обычно создаете базу данных после создания модели (используя сгенерированные сценарии SQL).

Вы объявили два последних свойства как виртуальные, поэтому сгенерированный SQL выглядит иначе. Из кода, который вы нам показываете, мы не можем видеть, откуда взялась ссылка на альбом.

Поскольку у вас есть база данных, я бы сгенерировал .edmx из модели в одном проекте. Затем вы можете использовать генератор кода POCO или генератор сущностей с самообследованием, чтобы генерировать сущности и сохранять их в другом проекте. Или вы можете написать их вручную, как у вас уже есть. Имена свойств должны соответствовать столбцам в базе данных.

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