在实体框架中使用可为空的唯一键

佩尔泽

我正在使用.net版本4.5.2和Oracle DB开发C#应用程序。

我的问题是我无法正确配置数据库的实体框架。该数据库在4列上包含一个唯一键,但是其中有2个可以为空。

[Key, Column("GEBRUIKER", Order = 0)]
public string User { get; set; }

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

[Key, Column("EL2", Order = 2)]
public short? Element2 { get; set; }

[Key, Column("EL3", Order = 3)]
public short? Element3 { get; set; }

当我尝试通过此代码从数据库中获取值时,我得到了空引用异常,因为元素2或3为空。

当我从元素2和3删除键时,我不会得到正确的数据,因为当元素1在2行相同时,第二行将缓存元素2和3。

问题:如何处理这些可为空的唯一键?


添加了更多信息:

好吧,这是数据库创建脚本的一部分:

CREATE TABLE USERS
(
  GEBRUIKER            VARCHAR2(3 BYTE)     NOT NULL,
  EL1                  VARCHAR2(6 BYTE)     NOT NULL,
  EL2                  NUMBER,
  EL3                  NUMBER
)

CREATE UNIQUE INDEX USERS_UK ON USERS
(GEBRUIKER, EL1, EL2, EL3)


ALTER TABLE USERS ADD (
  CONSTRAINT USERS_UK
  UNIQUE (GEBRUIKER, EL1, EL2, EL3)
  USING INDEX USERS_UK
  ENABLE VALIDATE);

由于存在多个使用此数据库的应用程序,因此无法对结构或数据进行任何更改。也已经有EL2和EL3行,其值为0。


示例数据:

{'USER1','A','A','C'}
{'USER1','A','B','B'}
{'USER1','B','A','C'}

当我执行linq查询以选择USER1 AND EL1 = AI时,将得到下一个结果:

{'USER1','A','A','C'}
{'USER1','A','A','C'}

代替:

{'USER1','A','A','C'} 
{'USER1','A','B','B'}
巴萨姆·阿鲁吉利(Bassam Alugili)

不,您不能这样做:

查看您的表创建SQL:

CREATE TABLE [dbo].[Users](
    [GEBRUIKER] [nvarchar](128) NOT NULL,
    [EL1] [nvarchar](128) NOT NULL,
    [EL2] [smallint] NOT NULL,
    [EL3] [smallint] NOT NULL,
 CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED 
(
    [GEBRUIKER] ASC,
    [EL1] ASC,
    [EL2] ASC,
    [EL3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

所有主键都不为空!!!!

假设您想破解此密钥并使用SQL自行更改它,那么您必须发送以下脚本,该脚本会将密钥从可为null的nun更改为nullabe!

  usersDatabaseContext.Database.ExecuteSqlCommand(@"
        while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY')) 
        begin 
            declare @sql nvarchar(2000) 
            SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[TableName]  DROP CONSTRAINT [' + CONSTRAINT_NAME + ']') 
            FROM information_schema.table_constraints 
            WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 
            exec (@sql) 
        end 

        ALTER TABLE Users DROP CONSTRAINT [PK_dbo.Users]

        ALTER TABLE Users ALTER COLUMN EL2 SMALLINT NULL 
        ALTER TABLE Users 
        ADD CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ( [GEBRUIKER] ASC, [EL1] ASC, [EL2] ASC, [EL3] ASC )", 
        TransactionalBehavior.DoNotEnsureTransaction);

        var user1 = new User { UserName = "Bassam", Element1 = "1", Element2 = null, Element3 = 3 };

我有 :

- Removed all foreign keys which are related to this table 
- Dropped the primary key
- Changed the **Column E2 to nullable**
- Adding the modified primary key again

如果是SQL Server,这将在SQL Server / Oracle DB中导致以下错误:无法在表“用户”中的可为空列上定义PRIMARY KEY约束。

考虑得很好,甚至可以说您可以做到主键会发生的事情:

您如何保证主键的唯一性?假设您的User实体将创建以下行:

Id1    Id2  Id3  , Id4

"a" , "a" , null , null

您不能再次创建相同的条目,因为该行将存在于表中!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架代码优先的唯一键错误

来自分类Dev

首先使用实体框架代码:设置唯一键约束不起作用

来自分类Dev

为可为空的列添加唯一键-SQL Server

来自分类Dev

在MySQL中使用列组作为唯一键

来自分类Dev

在视图的查询操作中使用的唯一键

来自分类Dev

如何为实体框架数据库的varchar列创建唯一键?

来自分类Dev

电子邮件+类型的实体框架唯一键约束

来自分类Dev

电子邮件+类型的实体框架唯一键约束

来自分类Dev

实体框架,代码优先:如何使外键不可为空

来自分类Dev

实体框架,代码优先:如何使外键不可为空

来自分类Dev

如何首先在实体框架代码中的 linq 中使用可为空列表?

来自分类Dev

如何使用Dapper.Contrib通过唯一键获取实体?

来自分类Dev

在模型级别定义具有唯一键的实体

来自分类Dev

具有非空值的唯一键

来自分类Dev

关于在Mongoid数据库索引中使用唯一键的困惑

来自分类Dev

从没有主键的表中使用唯一键创建视图

来自分类Dev

如何在React Native / Redux中使用推送路由为NavigationStateUtils创建唯一键?

来自分类Dev

如何在角度ng-repeat中使用唯一键过滤对象的对象?

来自分类Dev

如何在Terraform资源循环中使用非唯一键来创建唯一资源

来自分类Dev

如何在Terraform资源循环中使用非唯一键来创建唯一资源

来自分类Dev

Android唯一键

来自分类Dev

MySQL:唯一键

来自分类Dev

唯一键 [定制]

来自分类Dev

使唯一键与NULL值一起使用?

来自分类Dev

实体框架:将映射的外键从必需更改为可为空

来自分类Dev

如何使用替换为非唯一键?MySQL的

来自分类Dev

如何使用唯一键约束更新列?

来自分类Dev

MySQL唯一键无法使用更多列

来自分类Dev

Django:使用唯一键的灯具中的引用关系

Related 相关文章

  1. 1

    实体框架代码优先的唯一键错误

  2. 2

    首先使用实体框架代码:设置唯一键约束不起作用

  3. 3

    为可为空的列添加唯一键-SQL Server

  4. 4

    在MySQL中使用列组作为唯一键

  5. 5

    在视图的查询操作中使用的唯一键

  6. 6

    如何为实体框架数据库的varchar列创建唯一键?

  7. 7

    电子邮件+类型的实体框架唯一键约束

  8. 8

    电子邮件+类型的实体框架唯一键约束

  9. 9

    实体框架,代码优先:如何使外键不可为空

  10. 10

    实体框架,代码优先:如何使外键不可为空

  11. 11

    如何首先在实体框架代码中的 linq 中使用可为空列表?

  12. 12

    如何使用Dapper.Contrib通过唯一键获取实体?

  13. 13

    在模型级别定义具有唯一键的实体

  14. 14

    具有非空值的唯一键

  15. 15

    关于在Mongoid数据库索引中使用唯一键的困惑

  16. 16

    从没有主键的表中使用唯一键创建视图

  17. 17

    如何在React Native / Redux中使用推送路由为NavigationStateUtils创建唯一键?

  18. 18

    如何在角度ng-repeat中使用唯一键过滤对象的对象?

  19. 19

    如何在Terraform资源循环中使用非唯一键来创建唯一资源

  20. 20

    如何在Terraform资源循环中使用非唯一键来创建唯一资源

  21. 21

    Android唯一键

  22. 22

    MySQL:唯一键

  23. 23

    唯一键 [定制]

  24. 24

    使唯一键与NULL值一起使用?

  25. 25

    实体框架:将映射的外键从必需更改为可为空

  26. 26

    如何使用替换为非唯一键?MySQL的

  27. 27

    如何使用唯一键约束更新列?

  28. 28

    MySQL唯一键无法使用更多列

  29. 29

    Django:使用唯一键的灯具中的引用关系

热门标签

归档