首先抱歉我的英语。
我的问题:我有一个使用Asp.Net + EF代码优先的应用程序。我在SQL Server中有一个表:
Id TypeId Name
--------------------
1 1 Suite
2 1 Desk
在我的应用程序中,有两个插件在2个线程中运行。
我需要在我的表上创建一个约束 - TypeId = 1
每个表只能有3行。
因此,如果两个线程进行查询,则只有一个可以成功,因为TypeId = 1还剩1行。
我如何检查?如何不同时运行插入或者你有其他很好的解决方案?
每个TypeId的行数约束可以不同。还有另一个名为TypeConstraints的表,其中存储了两列。
TypeId RowsCount
1 3
2 5
3 4
4 11
5 8
依旧......
已找到解决方案:
ALTER function dbo.UdfCheckCount (
@TypeId int
) returns int as
begin;
declare @max int;
select @max = MaxCount from TypeConstraints where TypeId = @TypeId;
declare @count int =
(
select count(*) from Data where TypeId = @TypeId
)
return @max - @count;
end;
go
alter table Data WITH NOCHECK add constraint test check (dbo.UdfCheckCount(TypeId) >= 0)
答案 0 :(得分:0)
您可以在数据库上编写一个触发器来检查并触发错误。
CREATE TRIGGER dbo.Table
AFTER INSERT
AS
BEGIN
-- Do your check here to see if the type count has been exceeded
IF (SELECT COUNT(*) FROM dbo.Table WHERE TypeID = <etc ...> )
BEGIN
RAISERROR ('Maximum number of rows for this type has been exceeded', 16, 1);
ROLLBACK TRANSACTION;
END
END
然后,只需处理应用程序中的错误并从那里继续。
但是,我不确定触发器是如何从EF Code-First角度出发的。我无法想象它会导致任何问题。