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

本文关键字:POCO 进行 FluentAPI 映射 EF4 | 更新日期: 2023-09-27 18:28:07

我正在根据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);

我得到了这个异常,我不知道为什么,因为我指的是,我甚至把它映射到了表("产品"):{"Invalid object name 'dbo.Product1'."}

为什么会发生这种情况?

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

使用modelBuilder.Entity<Product>().Map,您将在Code First中使用一个相当高级的映射选项,称为表拆分。映射表明,您在Properties(p => new...)中列出的实体Product的属性应该映射到其他属性之外的另一个表。其余属性在表Products中,正如您在ToTable调用中定义的那样。对于其他属性,您根本没有指定表名(应该是Map(config => config.ToTable(...) ...操作中的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; }