Указание имени столбца в Entity Framework для ссылочного объекта - PullRequest
7 голосов
/ 10 декабря 2010

У меня есть предопределенная база данных, которую я хочу отобразить, используя 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 я переопределяю метод OnModelCreating и задаю таблицыимена для использования.

modelBuilder.Entity<Site>().ToTable("Site");

это прекрасно работает.

Когда я пытаюсь указать имя столбца, как показано ниже:

modelBuilder.Entity<LcuSetting>().Property(c => c.Site).HasColumnName("Site_Id");

я получаю следующее сообщение об исключении

Тип 'LcuSystemOnline.Models.Site' должен быть ненулевым типом значения, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Data.Entity.ModelConfiguration..Configuration.Types.StructuralTypeConfiguration.Property (System.Linq.Expressions.Expression>) '

Я понимаю исключение, но как мне узнать, как modelBuilder назначить конкретное имя столбца дляSite

1 Ответ

9 голосов
/ 15 декабря 2010

В CTP5 нельзя использовать атрибут Column для указания имени внешнего ключа, которое мы создаем.Вместо этого вы должны сделать это следующим образом с помощью свободного 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...