C# SQL Server-在每个插入中验证列

C# SQL Server-在每个插入中验证列,c#,sql-server-2012,entity-framework-core,C#,Sql Server 2012,Entity Framework Core,我正在编写一个.NETCore2.2C,代码优先,带有SQL Server后端的api。它只是被要求使api成为一个多租户api。因此,我将TenantId(INT NOT NULL)添加到所有DB表、queryfilter等中。。。一切正常 我想确保我没有这样做,将来也不会有人忘记在所有插入中添加TenantId。TenantId将始终是大于零的值。SQL Server中是否有方法确保每个表上的每个插入都有一个大于零的TenantId值?首先,似乎TenantId应该是表租户的外键。如果是,则

我正在编写一个.NETCore2.2C,代码优先,带有SQL Server后端的api。它只是被要求使api成为一个多租户api。因此,我将TenantId(INT NOT NULL)添加到所有DB表、queryfilter等中。。。一切正常


我想确保我没有这样做,将来也不会有人忘记在所有插入中添加TenantId。TenantId将始终是大于零的值。SQL Server中是否有方法确保每个表上的每个插入都有一个大于零的TenantId值?

首先,似乎
TenantId
应该是表租户的外键。如果是,则绝对不能为零或更小,否则:

在列中添加

CREATE TABLE your_table (
    TenantId INT NOT NULL CHECK(TenantId > 0)
    ...
)
若列为
非空
,那个么它应该出现在每个insert中,否则异常将抛出

无法将值NULL插入到表的列“TenantId”中 “dbo.your_table”;列不允许空值。 插入失败

然后,在C代码中使用数据注释属性

[Range(1, Int32.MaxValue)]
或者创建自己喜欢的:
[MinValue(1)]

要“确保每个表上的每个插入都有一个大于零的TenantId值”,还可以将构造函数与私有setter一起使用

public class Model
{
   public Model(int name, int tenantId)
   {
      Name = name;
      if(tenantId <= 0)
      {
          throw new Exception();
      }
      TenantId = tenantId;
   }

   public string Name { get; private set; }
   public int TenantId { get; private set; }
}
公共类模型
{
公共模型(int name,int tenantId)
{
名称=名称;

if(tenantId)您说您添加了
tenantId(int非null)
。您是否直接将其添加到数据库中?您知道您需要通过EF迁移添加该列和检查约束……或者您需要在字段中增加可升级性。@Clay-我没有直接将其添加到数据库中。我是通过代码添加的。虽然解决方案可行,但并非每个表都需要租户ID。您可以ld坚持让几个表拥有它,并且这些表作为外键映射到的关系隐式映射到特定租户。例如,如果您有一所学校(作为租户)和学生(映射到学校)如果每个学生都参加了一个课程,默认情况下,这些课程可以推断为属于一个没有ID的特定租户。@Adam-请参阅接受答案中关于FK的评论。由于我已经在每个表上都有一个租户,并且所有编码都在工作,您认为从“学生”中删除租户有什么好处吗表?在代码优先的EF世界中?代码优先有什么问题?您可以使用数据批注、添加属性检查或使用私有setter的构造函数,这取决于您的实现。这确实回答了我前面提到的问题。谢谢!不过,我查找或询问的下一件事是如何在实体框架中添加约束。@Ben不应该是作为ForeignKey添加到表Tenant中的TenantId?如果是,则它肯定不能为零或更小。有一个单独的租户数据库包含所有租户信息。因此,将其设为FK是不可能的。在启动应用程序时,我根据用于发出请求的api密钥从租户api获取租户Id。
public int TenantId {
    get {
        return _tenantId;
    }
    set {
        if (value <= 0) throw new Exception();
        _tenantId = value;
    }
}