在Entity Framework中为引用对象指定列名

7
我有一个预定义的数据库,我想使用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的映射约定,它在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>)”中。”
我理解这个异常,但是我该如何让modelBuilderSite分配特定的ColumnName呢?
1个回答

9
在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方法中对“Map”的调用。许多人都会遇到这个问题,我喜欢使用ColumnAttribute来帮助命名。
您可以查看我写的博客文章以获取更多详细信息: http://blogs.msdn.com/b/adonet/archive/2010/12/10/code-first-mapping-changes-in-ctp5.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接