在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'."}
为什么会发生这种情况?
使用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; }