Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架十进制截断问题_C#_Entity Framework_Ef Code First_Decimal_Entity Framework 6 - Fatal编程技术网

C# 实体框架十进制截断问题

C# 实体框架十进制截断问题,c#,entity-framework,ef-code-first,decimal,entity-framework-6,C#,Entity Framework,Ef Code First,Decimal,Entity Framework 6,我正在处理的项目首先使用EntityFramework6.0代码 我的一位同事由于缺乏EF的经验,手动将数据库中某个字段的字段类型更改为小数28,10,而不是使用DbContext的OnModelCreating方法进行更改。实体框架允许他这样做,不会在将来的迁移中出错 上周,另一位同事在从该表中克隆记录的过程中遇到问题,新记录中的十进制值被截断为小数点后2位,而没有进行舍入 使用EF上的存储库模式,该克隆的代码类似于以下代码: public void CloneAccounts(List<

我正在处理的项目首先使用EntityFramework6.0代码

我的一位同事由于缺乏EF的经验,手动将数据库中某个字段的字段类型更改为小数28,10,而不是使用DbContext的OnModelCreating方法进行更改。实体框架允许他这样做,不会在将来的迁移中出错

上周,另一位同事在从该表中克隆记录的过程中遇到问题,新记录中的十进制值被截断为小数点后2位,而没有进行舍入

使用EF上的存储库模式,该克隆的代码类似于以下代码:

public void CloneAccounts(List<Account> accounts, int newQuarterID)
{
    var newAccounts = new List<Account>();
    accounts.ForEach(account =>
    {
        var clonedAccount = new Account
        {
            QuarterID = newQuarterID
            AccountName = account.AccountName,
            AccountNumber = account.AccountNumber,
            Amount = account.Amount
        };

        newAccounts.Add(clonedAccount);
    });

    AccountRepository.AddMany(newAccounts);
    AccountRepository.Save();
}
作为一个补充,当我指出金额字段的声明是小数28,10时,实际上应该在OnModelCreating中,他继续这样做,并添加了一个迁移。有趣的是,这样做最终解决了上述代码的问题

我的问题有两个方面:

为什么这个问题也不影响原始记录的创建,而且只影响克隆? 为什么在OnModelCreating中添加这一行可以修复它?
谢谢

将codeFirst与EF一起使用时,它会在代码C或VB中创建模型,然后将模型复制到数据库中

为了回答你的问题,我可以说:

这个问题一开始并没有影响,因为当您创建模型时,所有的更改都直接对数据库进行了更改,然后您的表与模型中的表完全相同。 请记住,实体框架是一个ORM对象关系映射器,它为您创建了一组基于域模型的实体类,并且不费吹灰之力,这个域模型可以有三种不同的风格:代码优先、模型优先和数据库优先

代码优先意味着您通过创建一组类(又称实体)来启动项目,这些类将在数据库中表示您的关系模型。你的源是你的类,目标是你的数据库

Model first意味着您可以使用可视化工具(基本上是拖放、连接点等)启动项目,这样您就可以创建一个模型,在数据库中表示您的关系模型。您的源是您的模型,目标是您的数据库

Database first意味着通过从数据源(通常是数据库)中选择模型来启动项目,这种方法将在VisualStudio项目中为您创建一组类实体。您的源将是您的数据库,目标是您的代码

所以,无论您在上述场景中做了什么更改,都必须通过实体框架从源复制到目标

这里发生的是您的同事的错误,他直接在您的数据库中进行了更改,但必须首先从您的EF项目代码中进行更改

当您调用Clonnef Accounts时,会让所有的魔法连接到DB,执行查询,获取数据,将其转换到实体类,然后检索它们或visceversa->这是您的应用程序因InvalidCastException而崩溃的时候

EF不会在每次调用ClonneAccounts时检查表的一致性、方案或结构,它只是检索实体和数据库之间的数据并插入/更新数据。如果要更新/检查一致性并复制更改,则必须手动执行。这就是为什么在代码端修复模型并运行工具之前,它会将所有更改复制到数据库中。
希望对您有所帮助

如果您最初没有任何精度设置,代码优先的默认约定是创建只有两位小数的十进制列。我认为有可能这些记录最初被截断了


此外,默认情况下,SQL Server提供程序的SQL生成器会将SqlParameter.Scale属性设置为模型中定义的比例,除非已设置为false,否则这将影响数据库更新和插入。不过,我不确定那些带有额外小数位数的记录是如何进入数据库的。

1我知道如何使用Entity Framework。我知道实体框架做什么。你的回答有点傲慢。2任何地方都没有抛出异常。数据只是被截断了。你根本没有回答这个问题。表更改是在模型更改之后进行的,因此它们不相同,而您对2的回答也不相同。同样,为什么要克隆的原始记录在创建时不会受到相同的影响。在添加精度之前,是否有任何其他限制或类型配置?完全没有。这就是为什么这更奇怪的原因。数据库是由EF创建的吗?或者此代码是从现有数据库中首先生成的?数据库最初是由EF code-first创建的。但数据库中有超过2位小数的记录,这意味着这些记录是在我的同事手动创建后插入到应用程序中的 激怒了数据库。EF很好地保存了那些记录,但不是克隆的记录。是否在某个时候被切换?我想知道那些小数位数更多的记录最初是如何进入数据库的