Указание имени столбца в 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