我正在使用.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'}
不,您不能这样做:
查看您的表创建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] 删除。
我来说两句