2

MySQLでEntityFrameworkを使用していますが、データを挿入しようとするたびにNullReferenceExceptionが発生します。

  • コマンドを作成することでデータを直接挿入できますが、EntityFrameworkを使用すると爆発します。
  • Entity Frameworkはテーブルから選択するか、テーブルを更新するので、おそらくこれは主キーと関係があります

次の例外は、SaveChanges()メソッドからスローされます。


failed: System.NullReferenceException : Object reference not set to an instance of an object.
    at MySql.Data.Entity.ListFragment.WriteSql(StringBuilder sql)
    at MySql.Data.Entity.SelectStatement.WriteSql(StringBuilder sql)
    at MySql.Data.Entity.InsertStatement.WriteSql(StringBuilder sql)
    at MySql.Data.Entity.SqlFragment.ToString()
    at MySql.Data.Entity.InsertGenerator.GenerateSQL(DbCommandTree tree)
    at MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
    at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree)
    at System.Data.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree)
    at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree)
    at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(UpdateTranslator translator, Dictionary`2 identifierValues)
    at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
    at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
    at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
    at System.Data.Objects.ObjectContext.SaveChanges()

EF 5

public decimal CreateAlertNotification2(ulong alertServiceId, Alerting.alert_service_notification_type notificationType, string recipientName, string recipientEndpoint)
        {
            using (risk_fleetEntities dbContext = new risk_fleetEntities())
            {
                var newNotification = new alert_service_notification();
                newNotification.sys_alert_service_id = alertServiceId;
                newNotification.name = recipientName;
                newNotification.notification_type = Enum.GetName(typeof(Alerting.alert_service_notification_type), notificationType);
                newNotification.recipient = recipientEndpoint;
                dbContext.alert_service_notification.AddObject(newNotification);
                dbContext.SaveChanges();

                return newNotification.id;
            }
        }

MySQL 5


CREATE TABLE `alert_service_notification` (
  `id` bigint(20) unsigned AUTO_INCREMENT PRIMARY KEY, 
  `sys_alert_service_id` bigint(20) unsigned NOT NULL,
  `notification_type` ENUM("SMS", "Email"),
  `name` CHAR(50),
  `recipient` CHAR(50),
  FOREIGN KEY (`sys_alert_service_id`) REFERENCES `alert_service`(`id`) 
);
4

2 に答える 2

5

EF は unsigned int をサポートしていないため、この場合、Int64 が十分に大きくない (最大値 9,223,372,036,854,775,807 対 unsigned bigint の 18,446,744,073,709,551,615) ため、bigint を 10 進数として格納する必要があります。同じ理由で、Int64代わりにunsigned int も格納します。Int32

EF デザイナーで型を変更しようとすると、すべてが正しく行われず、実行時にこのようなエラーがスローされます。実際にedmxを開いて編集してこれを修正できます.EFをだまして、列が実際には署名されていないと仮定します. Int64列のすべての参照を見つけて、 /が言及されていないことを確認するdecimalだけです ( / が必要かどうかによって異なりますInt32) Int64。ただし、これを行っている場合、最大値を超えた場合、データベースが無効な値を返す可能性があります。

したがって、より簡単で正しい修正は、unsigned を使用したり、既存の列を unsigned から変更したりしないことです。一部の MySQL デザイナー ツールはデフォルトで署名されていない id 列を使用するため、注意してください。

于 2013-03-08T12:10:55.307 に答える
0

私の解決策はとてもシンプルでした。「符号なし」変数がないようにデータベースを編集し、そこからモデルを構築しました。魔法のように機能し、手動で編集する必要はありません。また、モデルの生成後にそれらを unsigned に戻しても問題はないようです。:)

于 2013-08-27T15:40:58.427 に答える