Entity Framework Путаница с виртуальными - PullRequest
3 голосов
/ 03 июня 2011

Я использую Entity Framwwork и Code First и очень запутался.У меня есть этот класс:

public class Blocks
{
    [Display(Name = "ID"),Required(ErrorMessage = "ID is required")]
    [Key,HiddenInput(DisplayValue=false)]
    public int BlockId  { get;set; }

    [Display(Name = "Blocked By"),Required(ErrorMessage = "Blocked By is required")]
    public int ProfileId  { get;set; }

    [Display(Name = "Blocked"),Required(ErrorMessage = "Blocked is required")]
    public int ProfileBlockedId  { get;set; }

    [Display(Name = "Date Blocked"),Required(ErrorMessage = "Date Blocked is required")]
    public DateTime BlockDateTime  { get;set; }

    [Display(Name = "Block Reason")] public string BlockReason  { get;set; }

    public virtual Profiles Profile { get; set; }
    public virtual Profiles ProfileBlocked { get; set; }
}

Класс профиля более или менее такой же, и добавляет отлично и имеет правильный SQL, но когда я запускаю / Blocks, я получаю эту ошибку:

MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'Extent1.Profile_ProfileId' in 'field list'
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
   at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
  at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior    behavior)

это потому, что произведенный sql:

SELECT 
  `Extent1`.`BlockId`, 
  `Extent1`.`ProfileId`, 
  `Extent1`.`ProfileBlockedId`, 
  `Extent1`.`BlockDateTime`, 
   `Extent1`.`BlockReason`, 
   `Extent1`.`Profile_ProfileId`, 
  `Extent1`.`ProfileBlocked_ProfileId`
  FROM `Blocks` AS `Extent1`

Обратите внимание на Profile_ и ProfileBlocked_.У меня они виртуальные, поэтому у меня есть выпадающие профили при добавлении или редактировании или имя профиля при отображении в списке.Странная вещь - это другие таблицы.Все работало нормально, кроме этого.

Вот код, который создает неправильный SQL и ломает:

//
    // GET: /Blocks/
    public ViewResult Index()
    {
        try {
        return View(context.Blocks.Include(blocks => blocks.Profile).Include(blocks => blocks.ProfileBlocked).ToList());
        }
        catch (Exception ex)
        {
           ModelState.AddModelError("",ex.Message);
           CompileAndSendError(ex);
           return View(context.Blocks.ToList());
        }
    }

Я использую:
ASP.net MVC 3
Шаблоны Razor
Платформа сущностей
Строительные леса MVC [custom T4]

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Дайте EF небольшую подсказку, каковы ваши свойства внешнего ключа, добавив аннотации к свойствам:

...
[ForeignKey("Profile")]
public int ProfileId  { get;set; }
...
[ForeignKey("ProfileBlocked")]
public int ProfileBlockedId  { get;set; }
...

Я считаю, что это всегда необходимо, когда у вас есть несколько свойств навигации, ссылающихся на одну и ту же цель.учебный класс.Соглашения в этом случае не определяют, какие свойства могут быть внешними ключами - и EF создает свои собственные имена столбцов FK (вещи Profile_ и ProfileBlocked_).И поскольку имена столбцов в БД различны, вы получаете исключение.

(я думаю, проблема не имеет ничего общего с тем, являются ли свойства виртуальными или нет.)

Редактировать

Вы также можете поместить атрибут ForeignKey в свойства навигации и указать, как называется свойства FK:

...
[ForeignKey("ProfileId")]
public virtual Profiles Profile { get; set; }
...
[ForeignKey("ProfileBlockedId")]
public virtual Profiles ProfileBlocked { get; set; }
...

Это приводит к тому же сопоставлению, и это толькоНасколько я могу судить, дело вкуса, что вы предпочитаете.

0 голосов
/ 08 июля 2011

Я сталкиваюсь с той же проблемой, но не могу ее использовать, используя предложенный атрибут ForeignKey.

Я установил MySQL Connector / NET 6.4.3.0.Когда я запускаю свой проект, я получаю почти такую ​​же ошибку, но ссылаюсь на System.Data.Entity.Разве это не MySql.Data.Entity?

Можете ли вы показать мне, как возможно изменить мой Web.config или ссылки для работы с MySQL.

EDIT

С некоторой помощью ( другой пост ) и следами и ошибками, я тоже заработал.

...