标签: sql-generation

实体框架6:如何覆盖SQL生成器?

我想在生成数据库模式(DDL)时修改由EF:CF生成的SQL,如实体框架团队建议的那样.

如何才能做到这一点?

我无法通过Google找到合适的内容.

entity-framework sql-generation ef-code-first ef-migrations entity-framework-6

11
推荐指数
1
解决办法
4912
查看次数

为什么EntityFramework的LINQ解析器以不同的方式处理外部定义的谓词?

我正在使用Microsoft的Entity Framework作为ORM,我想知道如何解决以下问题.我想ProductProducts集合中获得Product.StartDate比当今更大的对象.(这是整个问题的简化版本.)

我目前使用:

var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,在使用ToList()例如查询后,它可以正常工作,并且创建的SQL是有效的:

SELECT * FROM Product WHERE StartDate > (GetDate());
Run Code Online (Sandbox Code Playgroud)

但是,我想将谓词移动到一个函数以获得更好的可维护性,所以我尝试了这个:

private Func<Product, bool> GetFilter()
{
  Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
  return filter;
}
var query = dbContext.Products.Where(GetFilter());
Run Code Online (Sandbox Code Playgroud)

这也是从代码的角度来看,只要它返回相同的Product集合,但这次创建的SQL类似于:

SELECT * FROM Product;
Run Code Online (Sandbox Code Playgroud)

筛选器从SQL Server移动到客户端,使其效率降低.

所以我的问题是:

  • 为什么会发生这种情况,为什么LINQ解析器会以不同的方式处理这两种格式?
  • 我可以做些什么来利用过滤器分离但在服务器上执行它?

.net c# linq entity-framework sql-generation

9
推荐指数
2
解决办法
344
查看次数

实体框架 6:迁移删除列(如果存在)

在删除列的迁移操作期间,如何在尝试删除列之前先生成 SQL 以检查该列是否存在?

对于删除列操作,实体框架当前生成这样的 sql 来删除列:

// Migration Operation:
DropColumn("dbo.Table", "Column");

// TSQL generated:
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
Run Code Online (Sandbox Code Playgroud)

如何更改 SQL 以首先检查列是否存在:

// Migration Operation:
DropColumn("dbo.Table", "Column");

// TSQL desired:
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = Object_id('dbo.Table') AND name = 'Column')
BEGIN
    // Dependency management logic ...
    ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
END
Run Code Online (Sandbox Code Playgroud)

我知道可以通过继承自SqlServerMigrationSqlGenerator. 我这样做的尝试未能将默认放置列逻辑包装在一个IF块中。请参阅下面的示例:

public class CustomSqlServerMigrationSqlGenerator: SqlServerMigrationSqlGenerator
{
    /// <summary>
    /// Drop column only …
Run Code Online (Sandbox Code Playgroud)

entity-framework sql-generation ef-code-first entity-framework-6 entity-framework-migrations

6
推荐指数
1
解决办法
4100
查看次数

如何使用SQL :: Abstract生成SQL查询?

如何WHERE使用SQL :: Abstract为此查询生成子句:

SELECT COUNT(*)FROM表WHERE id = 111 AND NOT FIND_IN_SET(type,'1,2,3,4')AND status ='pending';

包含条件的正确方法是WHERE FIND_IN_SET(type, '1,2,3,4')什么?

mysql perl sql-generation

3
推荐指数
1
解决办法
1427
查看次数

EF Code First将额外的列添加到模型中不存在的查询中

这是我关于SO的第一个问题.

我有一个ASP.NET 4.0 MVC3项目,使用EF Code First作为ORM和FluentMigrator进行版本迁移.我有Message实体类,如下所示:

public class Message
{
    [Key]
    [Column("Message_Id")]
    public int Id { get; set; }

    public DateTime CreatedTime { get; set; }

    [Required]
    [StringLength(MaxSubjectLength)]
    public string Subject { get; set; }

    [Required]
    [StringLength(MaxBodyLength)]
    public string Body { get; set; }

    public Link Link { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

没有定义自定义映射,并且MSSQL Server 2012数据库表消息:

CREATE TABLE [dbo].[Messages](
    [Message_Id] [int] IDENTITY(1,1) NOT NULL,
    [CreatedTime] [datetime] NOT NULL,
    [Subject] [nvarchar](78) NOT NULL,
    [BodyHtml] [nvarchar](2000) NOT NULL,
    [Link_Id] [int] NULL,
    [Collection_Id] [int] NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-generation ef-code-first

3
推荐指数
1
解决办法
3998
查看次数