0

1 つは会社と呼ばれ、もう 1 つは場所と呼ばれる 2 つのテーブルがあります。会社には Id と名前があり、場所には Id、CompanyId、Name、および SubAccount があります。私は2つのプロジェクトを持っています。1 つは、すべての検証がある IMS.Data と Web フォーム ページがある IMS です。会社に場所がある場合(会社IDがどこかに外部キーである場合)、レコードを削除しないことを検証するのに問題があります。これまでのところ、すべてが機能していますが、ラムダ式を使用してチェックを行うために Locations CompanyId を参照することはできません。誰でも私を助けてくれますか?私はラムダ式が初めてです。

これが私が検証に使用している方法です

    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;
        }
    }
4

1 に答える 1

1

このデータと外部キーが適切に設定されたリレーショナル データベースがある場合は、変更をコミットし、外部キーの例外であるSqlExceptionwith codeを監視できます。547これは、削除するデータが他のテーブルによって参照されている場合にスローされます。

このように処理する利点は、コード内のすべての外部キー関係のチェックを定義するのではなく、データ ストアが有効であることを強制することです。後で新しい FK を追加すると、コード自体に新しいチェックを追加するのではなく、データベースによって自動的に適用され、コードによってキャッチされます。

于 2013-08-19T14:39:50.627 に答える