我正在学习针对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'."}
为什么会这样?
答案 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; }