我正在开发一个Core MVC项目,该项目从预先存在的数据库中读取数据(无需编写).不幸的是,这个数据库是一团糟,但我不能改变其中的任何东西(即使我可以,我不会用10英尺的杆子触摸它).
数据库的一些相关问题如下:
然而,我被迫从这个数据库中读取数据,并且更愿意使用实体框架来执行此操作.
该数据库托管在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)
仍然,尝试运行该项目会产生错误:
InvalidOperationException:实体类型"MyProject.Models.Order"需要定义主键.
我还可以添加更多内容以使此表与Entity Framework一起使用吗?
编辑:我发现它可以工作,如果我在上下文的 …
sql-server entity-framework composite-primary-key ef-database-first entity-framework-core
目前使用的是.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