小编Geo*_*e T的帖子

我应该如何为现有数据库表定义复合主键?

我正在开发一个Core MVC项目,该项目从预先存在的数据库中读取数据(无需编写).不幸的是,这个数据库是一团糟,但我不能改变其中的任何东西(即使我可以,我不会用10英尺的杆子触摸它).

数据库的一些相关问题如下:

  • 这些表彼此之间没有任何外键关系,并且包含最好输入子表的数据; 创建数据库的人似乎已经将表用作Excel电子表格.
  • 没有定义主键或外键.
  • 表和列的名称似乎是所包含数据的首字母(对于一个假想的示例,一个人通常将其命名为"Customer"的表将被命名为"dbbc",而不是"Database - Business Customer").
  • 这些表不在"dbo"架构中.

然而,我被迫从这个数据库中读取数据,并且更愿意使用实体框架来执行此操作.

该数据库托管在SQL Server 2008R2中.

通过使用[Table],[Column]和[Key]等属性来使用一个具有映射到实际列名称的适当属性名称的类,我可以使其在我必须使用的其中一个表上没有问题.然而,另一张桌子被证明是一个问题.

此表没有可以被视为主键的单个列,但我发现两列的组合对于每一行都是唯一的,因此它们可以被视为复合主键(即使它们未被定义为这样在数据库中).

我已经定义了一个类如下(我已经更改了名称来隐藏这个数据库的标识,就像我想要的名字和耻辱):

[Table("dbbo", Schema = "schema")]
public class Order
{
    [Key]
    [Column("order", Order = 0)]
    public string OrderNo { get; set; }

    [Key]
    [Column("order_line", Order = 1)]
    public string OrderLineNo { get; set; }

    [Column("qty")]
    public double Quantity { get; set; }

    [Column("pr")]
    public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  • 我已经为构成虚构复合主键的两列添加了[Key]属性.
  • 我已经为[Column]属性的Order属性添加了一个值,因为我读到它是复合键所必需的.
  • 我只映射了我需要使用的列,因为该表的列数比该项目的列数多10倍.

仍然,尝试运行该项目会产生错误:

InvalidOperationException:实体类型"MyProject.Models.Order"需要定义主键.

我还可以添加更多内容以使此表与Entity Framework一起使用吗?

编辑:我发现它可以工作,如果我在上下文的 …

sql-server entity-framework composite-primary-key ef-database-first entity-framework-core

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

我可以让实体框架使用sqlite的LIKE而不是instr()吗?

目前使用的是.NET Core 2.

我使用LINQ查询类似于:

var peopleInRoseStreet = context.Person
    .Include(p => p.Addresses)
    .Where(p => p.Addresses.Any(a => a.Text.Contains("rose")));
Run Code Online (Sandbox Code Playgroud)

EF似乎将此转换为:

SELECT "p".*
FROM "Person" AS "p"
WHERE EXISTS (
    SELECT 1
    FROM "PersonAddress" AS "a"
    WHERE (instr("a"."Text", 'rose') > 0) AND ("p"."Id" = "a"."person_id"))
ORDER BY "p"."Id"
Run Code Online (Sandbox Code Playgroud)

通过使用instr(),虽然PersonAddress.Text列设置为,但比较区分大小写COLLATE NOCASE.如果我修改上面的查询来LIKE代替使用,那么搜索就像我想要的那样不区分大小写.

是否可以强制使用EF LIKE

sqlite entity-framework case-insensitive sql-like entity-framework-core

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