#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; } на странице сайта, что и было причиной..