2010-12-10 40 views
6

我有一个预定义的数据库,我想使用实体框架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的映射约定它正在寻找在表LCUSettings列SiteSiteId,它找不到由于列实际上是一个名为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到特定的ColumnName分配给Site

回答

7

在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")); 
    } 
} 

注中的呼叫OnModelCreating方法“地图”。这是许多人遇到的问题,我喜欢使用ColumnAttribute来帮助名称。

你可以看到这篇博客文章,我写了更多的细节: http://blogs.msdn.com/b/adonet/archive/2010/12/10/code-first-mapping-changes-in-ctp5.aspx