使用POCO类时,表名称映射在EF 6中不起作用

本文关键字:EF 不起作用 映射 类时 POCO 使用 | 更新日期: 2023-09-27 18:20:47

我在下面的类中使用System.ComponentModel.DataAnnotations.Schema.TableAttribute,因此类"Order_Details"映射到Northwind数据库中的表"Order Details"。

类定义上方有一个属性[Table("Order Details"),用于将其映射到数据库表

问题是,当LINQ查询对数据库执行时,它会尝试查询数据库中的"Order_Details"表,而应该查询"Order Details"表。

问题:是否必须使用其他属性将此类映射到数据库中的"订单详细信息"表?这个POCO类(没有表属性)是由第三方代码生成器使用实体框架生成的。

[Table("Order Details")]
public class Order_Details
{
    [Key]
    [Column(Order = 0)]
    [Required]
    [Display(Name = "Order I D")]
    public Int32 OrderID { get; set; }
    [Key]
    [Column(Order = 1)]
    [Required]
    [Display(Name = "Product I D")]
    public Int32 ProductID { get; set; }
    [Required]
    [Display(Name = "Unit Price")]
    public Decimal UnitPrice { get; set; }
    [Required]
    [Display(Name = "Quantity")]
    public Int16 Quantity { get; set; }
    [Required]
    [Display(Name = "Discount")]
    public Decimal Discount { get; set; }
    // ComboBox
    public virtual Orders Orders { get; set; }
    public virtual Products Products { get; set; }
}

更新1:

由于没有edmx文件,而且它使用的是Jeow Li Huan在回答中建议的"Code first fluent API",因此我在建模事件中为"Order Details"添加了一个表映射,然后它就工作了。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //added this in place of Table attribute and it works
            modelBuilder.Entity<Order_Details>().ToTable("Order Details");
            modelBuilder.Entity<Orders>().ToTable("Orders");
            modelBuilder.Entity<Products>().ToTable("Products");
            modelBuilder.Entity<Customers>().ToTable("Customers");
            modelBuilder.Entity<Employees>().ToTable("Employees");
            modelBuilder.Entity<Shippers>().ToTable("Shippers");
            modelBuilder.Entity<Suppliers>().ToTable("Suppliers");
            modelBuilder.Entity<Categories>().ToTable("Categories");
        }

更新2

此外,Jeow提出的另一个解决方案是删除模型创建事件,只使用原始的表属性。这也起到了作用。

使用POCO类时,表名称映射在EF 6中不起作用

代码第一顺API

您使用的工具是否也使用OnModelCreating方法生成了DbContext,该方法使用代码将Order_Details映射到Order_Details表?

如果有,请将其移除。

数据库/模型优先

您使用的工具是否生成了导致忽略类上所有属性的.edmx文件?(在连接字符串下检查metadata=res://*/Models.Model.csdl,这意味着正在使用.edmx)。

如果存在.edmx,则必须使用该文件映射表。

我认为旧代码首先是这样工作的

该工具是否将edmx模式存储在数据库中?查找未在数据库中创建的表。

如果数据库中有edmx模式,则必须对其进行修改。