Cri*_*ris 158 .net entity-framework
我有一个现有的数据库,我想用EF4.0构建一个新的应用程序
某些表没有定义主键,因此当我创建新的实体数据模型时,我收到以下消息:"表/视图TABLE_NAME没有定义主键,也没有推断出有效的主键.此表/视图已被排除.要使用该实体,您需要检查您的架构,添加正确的密钥,并取消注释".
如果我想使用它们并修改数据,我是否必须在这些表中添加PK,或者是否有解决方法以便我不必?
Col*_*lin 106
我认为这是由蒂利托解决的:
我将在下面引用他的条目:
我们遇到了同样的问题,这就是解决方案:
要强制实体框架使用列作为主键,请使用ISNULL.
要强制实体框架不使用列作为主键,请使用NULLIF.
一种简单的方法是将视图的select语句包装在另一个select中.
例:
SELECT
ISNULL(MyPrimaryID,-999) MyPrimaryID,
NULLIF(AnotherProperty,'') AnotherProperty
FROM ( ... ) AS temp
Run Code Online (Sandbox Code Playgroud)
2010年4月26日17:00由Tillito回答
Dav*_*kle 64
错误意味着它所说的.
即使你可以解决这个问题,相信我,你也不愿意.可引入的令人困惑的错误数量令人震惊和可怕,更不用说你的表现可能会下降.
不要解决这个问题.修复您的数据模型.
编辑:我看到很多人都在贬低这个问题.我想这很好,但请记住,OP询问了如何在没有主键的情况下映射表,而不是视图.答案仍然是一样的.从可管理性,数据完整性和性能的角度来看,解决EF需要在表上使用PK是一个坏主意.
有些人评论说,他们没有能力修复底层数据模型,因为他们正在映射到第三方应用程序.这不是一个好主意,因为模型可以从你身下改变.可以说,在这种情况下,你想要映射到一个视图,这也不是OP所要求的.
Cod*_*und 20
如果我想使用它们并修改数据,我是否必须在这些表中添加PK,或者是否有解决方法以便我不必?
对于那些达到这个问题并且正在使用Entity Framework Core的人来说,您不再需要为表格添加PK或进行任何解决方法.自EF Core 2.1以来,我们有一个新功能查询类型
查询类型必须用于:
- 用作ad hoc FromSql()查询的返回类型.
- 映射到数据库视图.
- 映射到未定义主键的表.
- 映射到模型中定义的查询.
所以在你的DbContext中只需添加以下类型的属性,DbQuery<T>而不是DbSet<T>像下面那样.假设您的表名是MyTable:
public DbQuery<MyTable> MyTables { get; set; }
Run Code Online (Sandbox Code Playgroud)
Adr*_*cia 16
复合键也可以使用Entity Framework Fluent API完成
public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
public MyModelConfiguration()
{
ToTable("MY_MODEL_TABLE");
HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
...
}
}
Run Code Online (Sandbox Code Playgroud)
在 EF Core 5.0 中,您还可以在实体级别定义它。
[Keyless]
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public int Zip { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效
即使您没有PK,也不需要手动映射.您只需要告诉EF您的某个列是索引,索引列不可为空.
为此,您可以使用isNull函数向视图添加行号,如下所示
select
ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id
from a
Run Code Online (Sandbox Code Playgroud)
ISNULL(id, number) 这是关键点,因为它告诉EF这个列可以是主键
在我的情况下,我必须将实体映射到View,它没有主键.而且,我不允许修改此视图.幸运的是,这个View有一个唯一的字符串列.我的解决方案是将此列标记为主键:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[StringLength(255)]
public string UserSID { get; set; }
Run Code Online (Sandbox Code Playgroud)
被骗的EF.工作得很完美,没有人注意到...... :)
| 归档时间: |
|
| 查看次数: |
151592 次 |
| 最近记录: |