在EF4.1中使用POCO进行FluentAPI映射

时间:2012-03-18 20:42:59

标签: c# entity-framework-4.1 fluent

我正在学习针对northwind数据库的EF4.1。我有意创建了一个像这样的POCO类,它有不同的列名和属性,这些都不存在于方案中,因此我可以学习映射以准备更新我的遗留应用程序:

  public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public Decimal? UnitPrice { get; set; }
        public bool Discontinued { get; set; }
        public Int16 QuantityInStock { get; set; }
        public int CategoryID { get; set; }
        public Category Category { get; set; }
    }

我想将我的架构映射到此实体,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().Map(config =>
        {
            config.Properties(p => new
            {
                p.ProductName,
                p.ProductID,
                p.CategoryID,
                p.Discontinued,
                p.UnitPrice
            });
        });
    modelBuilder.Entity<Product>().ToTable("Products");
    base.OnModelCreating(modelBuilder);
}

奇怪的是,当我尝试这个时:

Product tmp = db.Products.Find(4);

我得到这个例外,我不知道为什么因为我指的是我甚至将它映射到ToTable(“产品”): 的 {"Invalid object name 'dbo.Product1'."}

为什么会这样?

1 个答案:

答案 0 :(得分:1)

使用modelBuilder.Entity<Product>().Map,您在Code-First中使用了一个非常高级的映射选项,称为表拆分。您的映射表明您在Product中列出的实体Properties(p => new...)的属性应该映射到除其他属性之外的另一个表。您在Products电话中定义的其他属性位于表ToTable中。对于其他属性,您根本没有指定表名(在ToTable操作中应该是Map(config => config.ToTable(...) ...)。我的猜测是EF假定某种默认表名Product1显然不存在。

我不确定您是否真的想将实体拆分为两个不同的表。读你的第一句......

  

...不相同的列名和属性   计划...

......我认为您主要需要以下两种映射选项:

数据库中没有相应列的模型类中的属性不是映射属性:

modelBuilder.Entity<Product>().Ignore(p => p.QuantityInStock);

使用数据注释:

[NotMapped]
public Int16 QuantityInStock { get; set; }

您可以通过以下方式将属性名称映射到另一个列名称:

modelBuilder.Entity<Product>().Property(p => p.Discontinued)
    .HasColumnName("MyOtherColumnName");

使用数据注释:

[Column("MyOtherColumnName")]
public bool Discontinued { get; set; }