C# 删除记录前使用lambda表达式检查外键

C# 删除记录前使用lambda表达式检查外键,c#,lambda,webforms,C#,Lambda,Webforms,我有两张桌子,一张叫做公司,另一张叫做地点。公司有Id和名称,地点有Id、CompanyId、名称和子帐户。我有两个项目。其中一个是IMS.Data,所有验证都在其中,而webforms页面在其中。我很难验证公司是否有位置(如果公司id是外键,则不删除记录)。这是我到目前为止所做的一切,但我无法引用位置CompanyId,以便使用lambda表达式进行检查。有人能帮我吗?我对lambda表达式还不熟悉 这是我用于验证的方法 namespace IMS.Data { public clas

我有两张桌子,一张叫做公司,另一张叫做地点。公司有Id和名称,地点有Id、CompanyId、名称和子帐户。我有两个项目。其中一个是IMS.Data,所有验证都在其中,而webforms页面在其中。我很难验证公司是否有位置(如果公司id是外键,则不删除记录)。这是我到目前为止所做的一切,但我无法引用位置CompanyId,以便使用lambda表达式进行检查。有人能帮我吗?我对lambda表达式还不熟悉

这是我用于验证的方法

    namespace IMS.Data
{
public class CompanyContext : IMSDBContext
{
    public Company DeleteCompany(Company company)
    {
        if (company.Name == null)
        {
            throw new Exception("Please select a record to delete.");
        }
        if (Companies.Any(x => x.Name == company.Name))
        {
            throw new Exception("Can not delete a company that has a location.");
        }
        Companies.Remove(company);
        return company;
    }

}
}
这是我使用的删除按钮

namespace IMS
{

public partial class CompanySetUp : Page
{
    private const string AddButton = "Add";
    private const string SaveButton = "Save";
    private const string DeleteButton = "Delete";
    private const string CancelButton = "Cancel";

    private int CompanyId // This puts the "CompanyId" into a viewstate and is used to update the record
    {
        get
        {
            return (int)ViewState["_companyId"];
        }
        set
        {
            ViewState["_companyId"] = value;
        }
    }

    private IList<Company> Companies { get; set; } // This gets and sets the list of companies from the table "Companies"

    protected void Page_Load(object sender, EventArgs e)
    {
        PopulateCompanyListGrid();
        //if (Companies != null && Companies.Count > 0) // This will put a record in the "txtCompanyName.Text" on page load
        //{
        //    txtCompanyName.Text = Companies.First().Name;
        //}

    }       

    protected void btnDelete_Click(object sender, EventArgs e) // This will delete the record that matches the textbox or throw an exception
    {
        CompanyContext context = null;
        switch (btnDelete.Text)
        {
            case DeleteButton:
                try
                {
                    context = new CompanyContext();
                    var company = context.Companies.ToList().First(x => x.Name == txtCompanyName.Text);

                    context.DeleteCompany(company);
                    //PopulateCompanyListGrid();
                    Reload();

                }
                catch (Exception ex)
                {
                    lblCompanyNameNotification.Text = ex.Message;
                }
                finally
                {
                    if (context != null)
                    {
                        context.Dispose();
                    }
                }
                PopulateCompanyListGrid();
                break;
            case CancelButton:
                Reload();
                break;
        }
    }
名称空间IMS
{
公共部分类公司设置:第页
{
私有常量字符串AddButton=“Add”;
private const string SaveButton=“Save”;
private const string DeleteButton=“Delete”;
private const string CancelButton=“取消”;
private int CompanyId//这将“CompanyId”置于视图状态,并用于更新记录
{
得到
{
返回(int)视图状态[“_companyId”];
}
设置
{
ViewState[“_companyId”]=值;
}
}
私有IList公司{get;set;}//从表“companys”中获取并设置公司列表
受保护的无效页面加载(对象发送方、事件参数e)
{
PopulateCompanyListGrid();
//如果(companys!=null&&companys.Count>0)//这将在页面加载的“txtCompanyName.Text”中放置一条记录
//{
//txtCompanyName.Text=companys.First().Name;
//}
}       
受保护的void btnDelete\u单击(对象发送者,事件参数)//这将删除与文本框匹配的记录或引发异常
{
CompanyContext上下文=空;
开关(btnDelete.Text)
{
案例删除按钮:
尝试
{
上下文=新公司上下文();
var company=context.companys.ToList().First(x=>x.Name==txtCompanyName.Text);
上下文。删除公司(公司);
//PopulateCompanyListGrid();
重新加载();
}
捕获(例外情况除外)
{
lblCompanyNameNotification.Text=ex.Message;
}
最后
{
if(上下文!=null)
{
context.Dispose();
}
}
PopulateCompanyListGrid();
打破
案例取消按钮:
重新加载();
打破
}
}

如果您有一个包含此数据的关系数据库,并且外键设置正确,那么您可以提交更改并使用code
547
监视
SqlException
,这是一个外键异常。当其他表引用要删除的数据时,会引发此异常


这样处理的好处是,数据存储强制自身有效,而不是为代码中的所有外键关系定义检查。如果以后添加新的FK,它们将自动由数据库强制并由代码捕获,而不必向代码本身添加新的检查。

Ok and c我监视或检查它,并抛出我想要的特定消息,而不是默认消息?我如何特别监视它?在您的
Try..Catch
simply
Catch(SQLException sqlEx){If(sqlEx.ErrorCode==547)…}
这对我来说是非常不清楚的
…但是我不能引用位置CompanyId以便使用lamda表达式进行检查…
?您想如何检查它们?在验证中,我想检查一家公司是否有位置(或者公司“id”是否是任何其他表上的外键“CompanyId”)然后显示错误消息“此公司有一个与其关联的位置,无法删除。”由于我设置上下文和每个方法的方式,我无法引用位置表中的companyid来编写这样的语句。我确信有一种方法,但我的第一份编程工作才刚开始一个月,还不确定如何进行。这有助于您理解我的想法吗?