2010-12-10 98 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