Указание имени столбца в Entity Framework для ссылочного объекта
у меня есть предопределенная база данных, которую я хочу сопоставить с помощью Entity Framework 4 CodeFirst.
public class Site
{
public int SiteId { get; set; }
public string SiteName { get; set; }
public DateTime InstallDate { get; set; }
public string Phase { get; set; }
public string Address { get; set; }
public string GpsPosition { get; set; }
public string NetworkDetail { get; set; }
public string SiteCode { get; set; }
public string UserGroupCode { get; set; }
public string InfrastructureNumber { get; set; }
public string Province { get; set; }
public virtual ICollection<LcuSetting> LcuSettings { get; set; }
}
и еще один класс
public class LcuSetting
{
public int LCUSettingId { get; set; }
[Column(Name="Site_Id")]
public Site Site { get; set; }
public string Name { get; set; }
public string IPAddress { get; set; }
public string SubnetMask { get; set; }
public string DefaultGateway { get; set; }
}
из-за соглашений отображения EF4 он ищет столбец SiteSiteId
в таблице LCUSettings, которую он не может найти, так как столбец фактически называется Site_ID
в своем DbContext
производный класс I переопределяет OnModelCreating
метод и установить имена таблиц для использования.
modelBuilder.Entity<Site>().ToTable("Site");
это работает штраф.
когда я пытаюсь указать имя столбца, однако, следующим образом
modelBuilder.Entity<LcuSetting>().Property(c => c.Site).HasColumnName("Site_Id");
я получаю следующее сообщение об исключении
тип ' LcuSystemOnline.Модели.Site 'должен быть ненулевым типом значения, чтобы использовать его в качестве параметра" T " в системе универсального типа или метода.Данные.Сущность.ModelConfiguration.Конфигурация.Типы.StructuralTypeConfiguration.система свойств.В LINQ.Выражения.Выражение>)'
I поймите исключение, но как мне, как получить modelBuilder
чтобы назначить определенное имя столбца Site
1 ответов
в CTP5 нельзя использовать атрибут Column для указания имени внешнего ключа, который мы создаем. Вместо этого вы должны сделать это таким образом с помощью fluent API:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Category Category { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(c => c.Products)
.IsIndependent()
.Map(mc => mc.MapKey(c => c.Id, "CategoryId"));
}
}
обратите внимание на вызов " Map " в методе OnModelCreating. Это то, с чем столкнулся ряд людей, и мне нравится идея использования ColumnAttribute, чтобы помочь с именем.
вы можете увидеть эту статью в блоге, которую я написал для более подробности: http://blogs.msdn.com/b/adonet/archive/2010/12/10/code-first-mapping-changes-in-ctp5.aspx