Entity framework EF代码首先使用错误的列创建查询
我正在使用EF6.0,并首先使用代码创建数据库视图。我有一个小样品,效果很好。我正在尝试迁移到另一组视图。出于某种原因,我在查询中得到了一个列的错误列名。这似乎是从我加入的另一个观点引入的专栏 我试图更改表上的[Key]列,但似乎没有改变 视图vABC由以下列组成:name varchar(30)和desc varchar(100) 视图vXYZ由以下列组成:name varchar(30)和amount float 他们将在名字上联合起来 这是我正在运行的查询的一个片段:Entity framework EF代码首先使用错误的列创建查询,entity-framework,ef-code-first,Entity Framework,Ef Code First,我正在使用EF6.0,并首先使用代码创建数据库视图。我有一个小样品,效果很好。我正在尝试迁移到另一组视图。出于某种原因,我在查询中得到了一个列的错误列名。这似乎是从我加入的另一个观点引入的专栏 我试图更改表上的[Key]列,但似乎没有改变 视图vABC由以下列组成:name varchar(30)和desc varchar(100) 视图vXYZ由以下列组成:name varchar(30)和amount float 他们将在名字上联合起来 这是我正在运行的查询的一个片段:
var name = dataRecord.Cells[0].Value.ToString();
var query = from b in _context.XYZ
.Where(b => b.name == name)
select b;
这是返回:
SELECT
1 AS [C1],
[Extent1].[name] AS [name],
[Extent1].[amount] AS [amount],
[Extent1].[ABC_name] AS [ABC_name]
FROM [dbo].[vXYZ] AS [Extent1]
WHERE [Extent1].[name] = @p__linq__0
我将在下面附上类和dbcontext
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Mynamespace
{
[Table("vABC")]
public class ABC
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public ABC()
{
XYZs= new HashSet<XYZ>();
}
[Key]
[StringLength(150)]
public string name { get; set; }
[StringLength(150)]
public string Desc { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<XYZ> XYZs{ get; set; }
}
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Mynamespace
{
[Table("vXYZ")]
public class Price
{
[Key]
[Required]
[StringLength(200)]
public string name{ get; set; }
public decimal? amount{ get; set; }
public virtual ABC ABC{ get; set; }
}
}
namespace Mynamespace
{
using System.Data.Entity;
public partial class myContext : DbContext
{
public myContext () : base("name=myContext ")
{
Database.SetInitializer<myContext >(null);
}
public virtual DbSet<ABC> ABCs { get; set; }
public virtual DbSet<XYZ> XYZs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<XYZ>()
.Property(e => e.amount)
.HasPrecision(19, 4);
}
}
}
我的理解是,如果列名在键列名中没有id,那么必须将[key]作为修饰符放在列名之上。我正在这样做。也许我需要在vXYZ上加上[ForeignKey(“name”)]。这就是问题所在吗?无论如何(流畅或属性),您必须告诉EF视图是如何关联的,因为关系不遵循命名约定。请注意,
vXYZ
必须有一个主键,我想不能是name
。是的。命名约定是一个问题。我修改了它,现在可以工作了。
SELECT [Extent1].[name] AS [name],
[Extent1].[amount] AS [amount]
FROM [dbo].[vXYZ] AS [Extent1]
WHERE [Extent1].[name] = @p__linq__0