C# EntityFramework:具有复数形式的不规则名称的模型配置
我有一个用ASP.NET MVC4编写的系统,EntityFramework代码优先,Razor代码优先。其中一个模型具有以下声明:C# EntityFramework:具有复数形式的不规则名称的模型配置,c#,entity-framework,asp.net-mvc-4,annotations,linq-to-entities,C#,Entity Framework,Asp.net Mvc 4,Annotations,Linq To Entities,我有一个用ASP.NET MVC4编写的系统,EntityFramework代码优先,Razor代码优先。其中一个模型具有以下声明: public class Flour : IEntityBase { [Key] public Guid FlourId { get; set; } public Guid ProcessId { get; set; } [Display(Name = "Timestamp", ResourceType = typeof(Reso
public class Flour : IEntityBase
{
[Key]
public Guid FlourId { get; set; }
public Guid ProcessId { get; set; }
[Display(Name = "Timestamp", ResourceType = typeof(Resources.Language))]
[Timestamp]
public Byte[] Timestamp { get; set; }
[Display(Name = "FlourAnalyzes", ResourceType = typeof(Resources.Language))]
public virtual ICollection<FlourAnalysis> FlourAnalyzes { get; set; }
[Display(Name = "Process", ResourceType = typeof(Resources.Language))]
public virtual Process Process { get; set; }
[Display(Name = "LastModified", ResourceType = typeof(Resources.Language))]
public DateTime LastModified { get; set; }
[Display(Name = "CreatedOn", ResourceType = typeof(Resources.Language))]
public DateTime CreatedOn { get; set; }
}
生成迁移后,EF创建了一个名为的表(我需要强制输入表名,否则EF将以单数形式创建表)。在插入一些数据后,EF不会通过上下文调用FlourAnalysis
数据Flour
对象:
[Authorize]
public ViewResult Details(System.Guid id)
{
var flour = context.Flours
.Include(f => f.FlourAnalyzes)
.Single(x => x.FlourId == id);
return View(flour);
}
编辑:
在提出一些建议后,我将.Single()
表达式更改为.Where()
,生成的SQL指向一个甚至不应该存在的列,ProcessId
:
{SELECT
[Project1].[C1] AS [C1],
[Project1].[ProcessId] AS [ProcessId],
[Project1].[FlourId] AS [FlourId],
[Project1].[Timestamp] AS [Timestamp],
[Project1].[LastModified] AS [LastModified],
[Project1].[CreatedOn] AS [CreatedOn],
[Project1].[Mesh_MeshId] AS [Mesh_MeshId],
[Project1].[C2] AS [C2],
[Project1].[FlourAnalysisId] AS [FlourAnalysisId],
[Project1].[FlourId1] AS [FlourId1],
[Project1].[MeshId] AS [MeshId],
[Project1].[Timestamp1] AS [Timestamp1],
[Project1].[StartTimestamp] AS [StartTimestamp],
[Project1].[HumidityPercentage] AS [HumidityPercentage],
[Project1].[StarchPercentage] AS [StarchPercentage],
[Project1].[Comments] AS [Comments],
[Project1].[LastModified1] AS [LastModified1],
[Project1].[CreatedOn1] AS [CreatedOn1],
[Project1].[Flour_ProcessId] AS [Flour_ProcessId]
FROM ( SELECT
[Extent1].[ProcessId] AS [ProcessId],
[Extent1].[FlourId] AS [FlourId],
[Extent1].[Timestamp] AS [Timestamp],
[Extent1].[LastModified] AS [LastModified],
[Extent1].[CreatedOn] AS [CreatedOn],
[Extent1].[Mesh_MeshId] AS [Mesh_MeshId],
1 AS [C1],
[Extent2].[FlourAnalysisId] AS [FlourAnalysisId],
[Extent2].[FlourId] AS [FlourId1],
[Extent2].[MeshId] AS [MeshId],
[Extent2].[Timestamp] AS [Timestamp1],
[Extent2].[StartTimestamp] AS [StartTimestamp],
[Extent2].[HumidityPercentage] AS [HumidityPercentage],
[Extent2].[StarchPercentage] AS [StarchPercentage],
[Extent2].[Comments] AS [Comments],
[Extent2].[LastModified] AS [LastModified1],
[Extent2].[CreatedOn] AS [CreatedOn1],
[Extent2].[Flour_ProcessId] AS [Flour_ProcessId],
CASE WHEN ([Extent2].[FlourAnalysisId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM [dbo].[Flours] AS [Extent1]
LEFT OUTER JOIN [dbo].[FlourAnalyzes] AS [Extent2] ON [Extent1].[ProcessId] = [Extent2].[Flour_ProcessId]
WHERE [Extent1].[FlourId] = @p__linq__0
) AS [Project1]
ORDER BY [Project1].[ProcessId] ASC, [Project1].[C2] ASC}
我做错了什么?默认情况下,实体框架将假定数据库中表的所有名称都是多元化的,或者在代码优先的情况下,您希望它们在创建时都是多元化的
检查一下这个,希望能有所帮助
为了避免出现与进程\u ProcessId
有关的错误,您需要添加一个属性:
[ForeignKey("ProcessId")]
public virtual Process Process { get; set; }
这是因为生成外键的约定将使用错误的列名
在分析
类中,您可能还需要类似的内容:
[ForeignKey("FlourId")]
public virtual Flour Flour { get; set; }
[ForeignKey("MeshId")]
public virtual Mesh Mesh { get; set; }
请注意,在所有情况下,我都从代码中省略了其他属性,只是为了突出显示我添加的内容
是一篇解释如何使用属性的旧文章
使用预先存在的数据库查看映射定义是否正确的一个有用提示是安装并使用查看实体数据模型DDL SQL选项查看EF认为数据库的外观。当生成的SQL与实际数据库不匹配时,您知道需要修改模型注释或配置。能否重新表述该问题?不清楚出了什么问题。据我所知,您可能有兴趣删除一个约定modelBuilder.Conventions.Remove()代码>?当我调用Details
方法时,在上下文调用中带来Flours
,不会检索相关的flouranalysis
。没有必要删除复数命名约定。是否确实在数据库中有给定id的相关实体?是。实际上,我正在使用一种变通方法,使用flour.FlourAnalysis=context.FlourAnalysis.Where(x=>x.FlourId==flour.FlourId).ToList()填充FlourAnalysis
。这个语句有效。您看过EF生成的SQL查询了吗?你能把它贴在这里吗?(如果您使用的是SQL Server,那么请使用SQL Profiler或EF特定工具。)正如我之前所评论的,我主要关心的是检索到的数据。表名生成不是问题。但我感谢你的回答。
[ForeignKey("FlourId")]
public virtual Flour Flour { get; set; }
[ForeignKey("MeshId")]
public virtual Mesh Mesh { get; set; }