Linq to SQL усекает десятичный тип, а не округляет его. По-видимому, это expected behavior. Чтобы обойти это, я округляю значение в своем коде C#. Например, скажем, у меня есть следующее:Linq to SQL вызывает хрупкую связь с базой данных
public class Foo
{
public decimal SomeNumber { get; set; }
}
Тип базы данных для SomeNumber десятичный (9,5). Эта точность была бизнес-решением, сделанным заказчиком.
Если SomeNumber является .00079547 в коде, L2S обрезает его до .00079 при отправке запроса на SQL Server. Мне нужно, чтобы число было округлено до 0,00080. Для того, чтобы сделать это, у меня есть этот метод в моем коде:
private static decimal RoundToMatchSqlServerPrecision(decimal numberToRound)
{
const int roundingPlaces = 5;
return Math.Round(numberToRound, roundingPlaces);
}
Как вы можете видеть, теперь у меня есть C# код, который тесно связан с типом в БД. Если мы изменим тип в БД, мы должны будем помнить об изменении этого кода, и это не круто. У меня есть два вопроса:
- Есть ли лучший способ?
- Если мне нужно поставить эту логику округления в код, имеет ли смысл, чтобы она шла на уровне бизнес-логики или на уровне доступа к данным?
* «Эта точность была бизнес-решением, сделанным заказчиком». * Возможно, это так, что это важное поведение домена не должно быть ответственностью базы данных? – MattDavey
Даже если ответственность не должна быть в БД, нам все равно нужно выбрать количество десятичных знаков для использования, а затем правильно округлить при сохранении в БД. –
То, что я пытался сказать, было, если это поведение домена, правило должно быть закодировано в модель домена в качестве инварианта. Это не имеет ничего общего с схемой базы данных как таковой.Вы намекнули на это в последнем предложении вашего вопроса. – MattDavey