Проблема с Первым отображением кода EF 4.1

#c# #entity-framework #mapping #ef-code-first #entity-framework-4.1

#c# #entity-framework #отображение #ef-code-first #entity-framework-4.1

Вопрос:

Все мои попытки сопоставить идентификатор SitePage с идентификатором столбца базы данных (таблица SitePages, столбец ID типа bigint) завершились неудачей. Он продолжает искать столбец SitePage_ID, чтобы сопоставить его .. Вы видите, где я делаю неправильно? Весь связанный код приведен ниже;

 public class Site : EntityBase<Int64>
{
    public virtual string Url { get; set; }
    public virtual IList<SitePage> Pages { get; set; }
}

public class SitePage : EntityBase<Int64>
{
    public virtual Site Site { get; set; }

    public virtual string Url { get; set; }
    public virtual string Html { get; set; }
    public virtual string Text { get; set; }
    public virtual string Language { get; set; }
}

public abstract class EntityBase<T> : IComparable
{

    public virtual T ID { get; set; }

    protected EntityBase() : this(default(T)) 
    { 
    }

    protected EntityBase(T id)
    {
        this.ID = id;

        if (this.ID == null)
            this.ID = default(T);
    }
}

public class SpellCrawlerContext : DbContext
{
    public SpellCrawlerContext(){}

    public DbSet<Site> Sites { get; set; }

    public DbSet<SitePage> SitePages { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Site>()
            .HasMany(s => s.Pages)
            .WithRequired(p => p.Site)
            .Map(s => s.MapKey("SiteID"));

        modelBuilder.Entity<SitePage>()
            .HasKey(p => p.ID);

        modelBuilder.Entity<SitePage>()
            .Property(p => p.ID)
            .HasColumnName("ID");

    }
}
  

Комментарии:

1. Можете ли вы уточнить ожидаемый формат таблицы? Имеющийся у вас код генерирует столбец Site_ID в таблице SitePages, но ни в одной из таблиц столбца SitePage_ID нет.

2. Я использовал предоставленный вами код и позволил EF сгенерировать схему базы данных. Схема сгенерирована правильно, и у меня не было ошибок. Может ли чего-то не хватать в предоставленном примере кода?

3. У меня не получается, чтобы EF генерировал таблицы.. Я подключаюсь к существующей базе данных. В основном каждая таблица имеет столбец ID в качестве столбца первичного ключа / идентификатора. Идентификатор в EntitiyBase отображается непосредственно в столбец ID каждой таблицы. EF по какой-то причине ожидает столбец SitePage_ID, хотя я явно указываю ему сопоставить свойство ID класса SitePage со столбцом ID при создании OnModelCreating.. Я предполагаю, что я делаю это неправильно, но я не знаю, где

Ответ №1:

Вы не делаете ничего неправильного. Приведенный вами код выполняет все правильно. Вам даже не нужно явно определять имя ID в SitePage , потому что оно все равно будет определено как ID .

SitePage_ID используется по соглашению об именовании по умолчанию для внешних ключей, созданных для независимых ассоциаций. Итак, есть ли у вас какое-либо другое отношение «один ко многим» между SitePage и любым другим объектом? Если вы не сопоставили внешний ключ в зависимом объекте, по умолчанию он будет определен как SitePage_ID .

Комментарии:

1. Спасибо, Ладислав, у меня был общедоступный виртуальный IList<Страница сайта> дочерние страницы { get; set; } на странице сайта, что и было причиной..