В базе данных price
столбец установлен на decimal(20, 2)
.
Это означает, что он может содержать 18 цифр до десятичной точки и 2 цифры после десятичной точки.Верно?
Теперь, когда я пытаюсь сохранить значение 12345678.00
, он говорит: parameter value is out of range
Что я делаю не так?
Обновление:
123456.00 is saved in db.
1234567.00 gives exception
Исключение:
System.Data.Entity.Infrastructure.DbUpdateException: при обновлении записей произошла ошибка.Смотрите внутреннее исключение для деталей.---> System.Data.Entity.Core.UpdateException: при обновлении записей произошла ошибка.Смотрите внутреннее исключение для деталей.---> System.ArgumentException: значение параметра «12345678.00» находится вне диапазона.в System.Data.SqlClient.TdsParser.TdsExecuteRPC (SqlCommand cmd, _SqlRPC [] rpcArray, тайм-аут Int32, логический inSchema, SqlNotificationRequest уведомлениеRequest, запрос TdsParserStateObject, время завершения выполнения 1, дубликат задачи для задачи, объектный объект, логический процессBoolean & usedCache, Boolean asyncWrite, Boolean inRetry) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource 1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.BeginExecuteNonQueryInternal(CommandBehavior behavior, AsyncCallback callback, Object stateObject, Int32 timeout, Boolean inRetry, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.BeginExecuteNonQueryAsync(AsyncCallback callback, Object stateObject) at System.Threading.Tasks.TaskFactory
1.FromAsyncImpl (Func 3 beginMethod, Func
2 endFunction, Действие 1 endAction, Object state, TaskCreationOptions creationOptions) at System.Threading.Tasks.TaskFactory
1-й интерфейсСостояние объекта) в System.Data.SqlClient.SqlCommand.ExecuteNonQueryAsync (CancellationToken cancellationToken) --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в системе.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Data.Entity.Utilities.TaskExtensions.CultureAwaiter 1.GetResult() at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.<ExecuteAsync>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.<UpdateAsync>d__0.MoveNext() --- End of inner exception stack trace --- at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.<UpdateAsync>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.Objects.ObjectContext.<ExecuteInTransactionAsync>d__3d
1.MoveNext () --- Конец трассировки стека от предварительнойМесто, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Data.Entity.jectOject.ject.Obd__39.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача Task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationв System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.d__9 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesInternalAsync>d__31.MoveNext() --- End of inner exception stack trace --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult ()
Обновление:
Я создал новую базу данных и запустилМиграция, чтобы убедиться, что столбец базы данных именно то, что я ожидаю, и вот оно:
Полный код:
Ad.cs:
[Table("ad")]
public class Ad
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column("id")]
public Guid Id { get; set; }
[Column("price")]
public decimal Price { get; set; }
//other attributes
}
Класс миграции Db:
public partial class added_price_to_ad : DbMigration
{
public override void Up()
{
AddColumn("dbo.ad", "price", c => c.Decimal(nullable: false, precision: 20, scale: 2));
}
public override void Down()
{
DropColumn("dbo.ad", "images_count");
}
}
AdVm.cs:
public class AdVm
{
public string Id { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString =
"{0:#.#}")]
public decimal Price { get; set; }
//other attributes
}
create.cshtml:
@model ProjectName.ViewModels.AdVm
@using (Html.BeginForm("Save", "Ads", FormMethod.Post, new { id = "CreateAdForm" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true)
@Html.HiddenFor(x => x.Id)
<div class="form-group">
@Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
</div>
</div>
<input type="submit"/>
}
Контроллер:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Save(AdVm adVm)
{
var ad= Mapper.Map<AdVm, Ad>(adVm);
db.Ads.Add(ad);
await db.SaveChangesAsync(); //throws exception here
return RedirectToAction("Details", new { id= ad.Id });
}