コンテキスト: FormView を使用して生徒データを編集し、SQL Server DB に挿入する Web アプリケーション (asp.net)。エラー:
System.Data.SqlClient.SqlException: 値 NULL を列 'txtSchoolID'、テーブル 'iSAMS.dbo.TblPupilManagementPupils' に挿入できません。列はヌルを許可しません。INSERT は失敗します。
コントロールを含むaspxページがありFormView
、コントロールには(編集、挿入、読み取り専用)テンプレートとボタン(データの更新と挿入用)が含まれています。挿入では、onclick イベント ハンドラーを使用して、TblPupilManagementPupils
テーブルに新しい行を挿入します。
このテーブルには、(他の列とともに) 次のプロパティを持つ主キーが含まれています。
アイデンティティ: 真 ID シード: 1 ID 増分: 1 データ型: int 主キー: 真 null を許可: false
codebehond ファイル内では、objectcontext を使用してエンティティ コレクションを登録し、新しいオブジェクトを送信しています。下記参照:
protected void btnInsertCandidate_onClick(object sender, EventArgs e)
{
//string SchoolCode = ((Label)selectedCandidateFormView.FindControl("lblCandidateKey")).Text;
string FirstName = ((TextBox)selectedCandidateFormView.FindControl("txbFirstName")).Text;
string LastName = ((TextBox)selectedCandidateFormView.FindControl("txbLastName")).Text;
string PreName = ((TextBox)selectedCandidateFormView.FindControl("txbPreName")).Text;
string Gender = ((TextBox)selectedCandidateFormView.FindControl("txbGender")).Text;
string DOB = ((TextBox)selectedCandidateFormView.FindControl("txbCandidateDOB")).Text;
string YoE = ((TextBox)selectedCandidateFormView.FindControl("txbCandidateYearOfEntry")).Text;
string NCEY = ((DropDownList)selectedCandidateFormView.FindControl("ddlCandidateNCEntryYear")).SelectedValue.ToString();
string BoardingType = ((DropDownList)selectedCandidateFormView.FindControl("ddlCandidateBoardingType")).SelectedValue.ToString();
string Languages = ((TextBox)selectedCandidateFormView.FindControl("txbCandidateLanguage")).Text;
string Nationalities = ((TextBox)selectedCandidateFormView.FindControl("txbCandidateNationality")).Text;
// insert a new candidate into iSAMS (pupil record) via LINQ. Effectively copying a candidate from Admissions into a new pupil row in iSAMS.
using (AdmissionsVerificationApplication.iSAMSEntities iSAMSContext = new AdmissionsVerificationApplication.iSAMSEntities())
{
TblPupilManagementPupil pupil = new TblPupilManagementPupil()
{
txtForename = FirstName,
txtSurname = LastName,
txtPreName = PreName,
txtGender = Gender,
txtDOB = Convert.ToDateTime(DOB),
intEnrolmentSchoolYear = Convert.ToInt32(YoE),
intEnrolmentNCYear = Convert.ToInt32(NCEY),
txtType = BoardingType,
txtLanguage = Languages,
txtNationality = Nationalities
};
iSAMSContext.TblPupilManagementPupils.AddObject(pupil);
iSAMSContext.SaveChanges();
}
}
また、.edmx ファイルをチェックして、ID 列の edmx:StorageModels タグの下に正しいプロパティがあることを確認しました。
<EntityType Name="TblPupilManagementPupils">
<Key>
<PropertyRef Name="TblPupilManagementPupilsID" />
</Key>
<Property Name="TblPupilManagementPupilsID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
……
完全を期すために (私が思うに!)、生成された edmx デザイナー ファイルの関連セクションを次に示します。
public partial class TblPupilManagementPupil : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new TblPupilManagementPupil object.
/// </summary>
/// <param name="tblPupilManagementPupilsID">Initial value of the TblPupilManagementPupilsID property.</param>
/// <param name="txtSchoolID">Initial value of the txtSchoolID property.</param>
public static TblPupilManagementPupil CreateTblPupilManagementPupil(global::System.Int32 tblPupilManagementPupilsID, global::System.String txtSchoolID)
{
TblPupilManagementPupil tblPupilManagementPupil = new TblPupilManagementPupil();
tblPupilManagementPupil.TblPupilManagementPupilsID = tblPupilManagementPupilsID;
tblPupilManagementPupil.txtSchoolID = txtSchoolID;
return tblPupilManagementPupil;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 TblPupilManagementPupilsID
{
get
{
return _TblPupilManagementPupilsID;
}
set
{
if (_TblPupilManagementPupilsID != value)
{
OnTblPupilManagementPupilsIDChanging(value);
ReportPropertyChanging("TblPupilManagementPupilsID");
_TblPupilManagementPupilsID = StructuralObject.SetValidValue(value);
ReportPropertyChanged("TblPupilManagementPupilsID");
OnTblPupilManagementPupilsIDChanged();
}
}
}
private global::System.Int32 _TblPupilManagementPupilsID;
partial void OnTblPupilManagementPupilsIDChanging(global::System.Int32 value);
partial void OnTblPupilManagementPupilsIDChanged();
.....
ID生成にDBを使用するようにマッピングに指示するために、IsDBGeneratedプロパティを設定する必要があるかもしれないことをどこかで読みました....しかし、これは生成されたファイルであるため、プロパティを追加する方法がわかりません。本当にこれが問題なら。
どんな助けでも大歓迎です。
よろしく
バリー