2

我在 MySQL 中使用实体框架,每次尝试插入数据时它都会给我一个 NullReferenceException。

  • 我可以通过创建命令直接插入数据,但是当我使用实体框架时它会爆炸。
  • 实体框架将从表中选择或更新表,所以这可能与主键有关

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()

英孚 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 不支持无符号整数,因此在这种情况下,它必须将 bigint 存储为十进制,因为 Int64 不够大(最大值 9,223,372,036,854,775,807 与无符号 bigint 的 18,446,744,073,709,551,615)。出于同样的原因,它还将存储一个 unsigned int asInt64而不是。Int32

如果您尝试更改 EF 设计器中的类型,它并不能完全正确地完成所有操作,并在运行时引发类似这样的错误。您实际上可以打开 edmx 并对其进行编辑以解决此问题,您可以欺骗 EF 假设该列并非真正无符号。只需找到您的专栏的所有引用并确保它们都没有提及Int64/ decimal(取决于您是否需要Int32/ Int64)。但是,如果您这样做,如果您超过最大值,您的数据库可能会返回无效值。

因此,更简单且正确的解决方法是不使用无符号或将现有列从无符号更改。某些 MySQL 设计器工具默认使用无符号 id 列,因此请注意!

于 2013-03-08T12:10:55.307 回答
0

我的解决方案非常简单。刚刚将数据库编辑为没有“无符号”变量,并从中构建模型。像魅力一样工作,无需手动编辑。此外,在生成模型后将它们改回无符号似乎没有问题。:)

于 2013-08-27T15:40:58.427 回答