Pra*_*eek 31 c# entity-framework
我只是从msdn实践代码第一个新的数据库实体框架,我想知道是否可以在代码中创建一个没有主键的表第一个新的数据库EF?
sir*_*adk 43
EF可以对数据库做什么,以及数据库可以做什么有很大的不同.
大多数数据库允许表没有主键.大多数数据库还允许表没有聚簇索引/索引组织表(或者它是其他数据库系统中的特定术语).
这没有什么不对,并且不应该说没有PK的桌子是个坏主意.
与往常一样,它依赖于特定表的需求和用法.例如,日志表,不需要PK.它永远不会被用作FK,所以它有什么用?
最重要的是,EF不支持没有开箱即用的表格,有一些奇怪的解决方法,但我所看到的都不够好.这是一种耻辱.
Wah*_*tar 21
不可以,因为实体框架需要知道在进行更新或删除操作时跟踪对象的密钥.
无论如何,拥有没有PrimaryKey的表并不是一个好主意
Sea*_*n B 12
如果您的SQL表没有主键,您仍然可以在Entity Framework中对其进行建模,您只需要为该实体定义一个键.选择实体上的一个或多个(可能是所有)列,这些列在组合时将唯一标识实体集合中的该实例.请注意,这仅对更新或删除实体很重要,因为它们需要与该集合中的其他实体进行唯一标识,以定位更改.查找/选择和添加/插入不需要此一致性.
从.NET Core 2.1开始,EF Core支持不带主键的模型。
这是通过查询类型而不是完整性类型的概念来实现的。
请参阅https://docs.microsoft.com/zh-cn/ef/core/modeling/query-types
查询类型的一些主要使用方案是:
- 用作临时FromSql()查询的返回类型。
- 映射到数据库视图。
- 映射到未定义主键的表。
- 映射到模型中定义的查询。
查询类型有限制。它们不能在数据库中插入,更新或删除。并且它们仅对导航属性提供有限的支持。
有时无法添加PK,因为它可能是您必须使用的只读,受超级保护的客户端数据库。EF即使在SELECT操作上也会引发异常。当我遇到这个问题时,我能够这样解决(名称是人为的):
[Table( "WeirdTable", Schema = "SomeSchema" )]
public class WeirdTable
{
[Column( "ID1" )]
public int Id1 { get; set; }
[Column( "ID2" )]
public int Id2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在上下文的代码文件中:
protected override void OnModelCreating( DbModelBuilder model_builder )
{
base.OnModelCreating( model_builder );
model_builder.Entity<WeirdTable>().HasKey(
t => new { t.Id1, t.Id2 }
);
}
Run Code Online (Sandbox Code Playgroud)
因此,基本上,您只需要指定哪些列可以为主键。
归档时间: |
|
查看次数: |
41720 次 |
最近记录: |