Entity Frameworkは次の例外をスローしています:
「BranchIdentity」の「PasswordIterations」プロパティを「System.String」値に設定できませんでした。このプロパティは、 'System.Int32'タイプのnull以外の値に設定する必要があります。
それはこの行に投げています:
// Validate uniqueness or email and username
var user = sqlStorage.BranchIdentities.FirstOrDefault(i => i.Username.ToLower() == viewModel.Username.ToLower());
例外は、クエリに一致するエンティティがある場合にのみスローされます。一致がない場合、例外はスローされません。
私のBranchIdentityモデル:
namespace Branch.Models.Sql
{
public class BranchIdentity
{
[Key]
public int Id { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string PasswordHash { get; set; }
[Required]
public string PasswordSalt { get; set; }
[Required]
public int PasswordIterations { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string FullName { get; set; }
public virtual ICollection<BranchIdentitySession> BranchIdentitySessions { get; set; }
public virtual BranchRole BranchRole { get; set; }
public virtual GamerIdentity GamerIdentity { get; set; }
}
}
そして私のスキーマ(SQLデータベースから取得)-コードファーストの移行を使用して自動生成:
CREATE TABLE [dbo].[BranchIdentities] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Username] NVARCHAR (MAX) NOT NULL,
[PasswordHash] NVARCHAR (MAX) NOT NULL,
[PasswordSalt] NVARCHAR (MAX) NOT NULL,
[PasswordIterations] INT NOT NULL,
[Email] NVARCHAR (MAX) NOT NULL,
[BranchRole_Id] INT NULL,
[GamerIdentity_Id] INT NULL,
[FullName] NVARCHAR (MAX) DEFAULT ('') NOT NULL,
CONSTRAINT [PK_dbo.BranchIdentities] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.BranchIdentities_dbo.BranchRoles_BranchRole_Id] FOREIGN KEY ([BranchRole_Id]) REFERENCES [dbo].[BranchRoles] ([Id]),
CONSTRAINT [FK_dbo.BranchIdentities_dbo.GamerIdentities_GamerIdentity_Id] FOREIGN KEY ([GamerIdentity_Id]) REFERENCES [dbo].[GamerIdentities] ([Id])
);
私はPasswordIterations
をヌル可能にしようとしましたが、役に立ちませんでした。
これに関して問題を抱えている他の人のために。 DatabaseContext
にブレークポイントを設定し、正しいデータベースに接続していることを確認します。私が忘れていたweb.configファイルから上書きされていました。
スキーマとエンティティが一致していないようです。コードを最初に生成したコードを投稿しましたが、テーブルが作成されてから変更されている可能性があります。 SQL Server Managerでテーブルを確認し、その列のデータ型を再確認します。
私はこれに遭遇しましたSO同様の問題を解決する方法の投稿。
私のストアドプロシージャには、結果セットの最初の列に文字列または整数を返す条件付きロジックが含まれていることがわかりました。
EFは、文字列を返す結果セットコードの最初のビットを取得したようです。
Sprocに文字列を返すようにして、これを修正しました。
Null可能である場合、なぜ必須としてマークされているのですか?必要なフラグを削除すると、期待どおりに動作するはずです。
私の実際のデータベースでは、私のフィールドはnull対応のintでしたが、コード内の私のモデルでは、私のフィールドは単純なintでした。私はそれをintに変更しましたか? (nullable int)そして今はうまく動作します。
EFモデルへのprocインポートで同様の問題があり、selectステートメントが変更されていることがわかりました。EFは、結果フィールドを、生成された元のモデルで定義されたintではなく文字列として認識していました。 procのフィールドを明示的にintにキャストする必要があり、すべてが再び満足しました。
そのようなエラーの可能性は、データ型をstring
からint
に変更した後に見ました。
変更前
public string foo { get; set; }
変更後
public int foo { get; set; }
この変更前は、string
はnull
値をテーブルに挿入できるようにします。変更後、それらの古いnullはそのようなエラーをスローする理由になる可能性があります。
質問は解決されましたが、他の誰かに役立つかもしれません:
データベースへの正しい接続を書き込んでいることを確認してください。次の方法でc#に接続文字列を生成させることができます。
新しいアイテムを追加します->データ-> ADO.Netエンティティデータモデル->最初にデータベースからコード--->新しい接続--->とパラメーターを指定して接続をテストします-> ok- -> ok->最後まで
web.configを開くと、接続文字列が見つかります
データベースにnull許容列があるかどうかも確認して、次のようにクラスに実装します。例:public int? WorkedYears {get;セットする; }
ref: EFCode First Property Null problem
ビューにも同じ問題がありました。ビュースクリプトの問題のある列のnvarcharへの明示的なキャストとモデルの更新により、修正されました