实体框架不更新位数据类型

Posted

技术标签:

【中文标题】实体框架不更新位数据类型【英文标题】:Entity Framework doesn't update bit datatype 【发布时间】:2021-12-25 07:26:20 【问题描述】:

我添加了一个新列 IsForceLogOff(数据类型 = 位)。当我以通常的方式更新表格时,除了新添加的 bool 列之外,所有内容都会更新。

public static UserErrorStatus UserUpdate(User user, Company company)

    UserErrorStatus status = UserErrorStatus.Error;

    using (OAPDataLayerEntities DbEntity = GetDBContext())
    
        try
        
            using (TransactionScope transaction = new TransactionScope())
            
                user.IsForceLogOff = true;
                DbEntity.Users.Attach(user);
                DbEntity.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);

                DbEntity.SaveChanges();
                transaction.Complete();

                DbEntity.AcceptAllChanges();
                status = UserErrorStatus.Success;
            
        
    

创建表语句:

CREATE TABLE [dbo].[User]
(
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [AddressID] [int] NULL,
    [AccountTypeID] [int] NOT NULL,
    [StaffID] [int] NULL,
    [SalutationID] [int] NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
    [EmailAddress] [nvarchar](100) NOT NULL,
    [Password] [nvarchar](50) NOT NULL,
    [SecurityQuestionID] [int] NOT NULL,
    [SecurityAnswer] [nvarchar](50) NOT NULL,
    [PhoneNumber1] [nvarchar](50) NULL,
    [PhoneNumber2] [nvarchar](50) NULL,
    [Fax] [nvarchar](50) NULL,
    [CompanyID] [int] NULL,
    [DateCreated] [smalldatetime] NOT NULL,
    [DateModified] [smalldatetime] NOT NULL,
    [DateLastLogin] [smalldatetime] NOT NULL,
    [UserIDModified] [int] NULL,
    [StatusID] [int] NOT NULL,
    [Notes] [ntext] NULL,
    [IsForceLogOff] [bit] NOT NULL
)

参考上面的sql

【问题讨论】:

向我们展示 CREATE TABLE 表定义、用户实体和用户配置 @CaiusJard 用实体详细信息的截图更新了问题 我更希望右键单击表格>>脚本作为>>创建>>到剪贴板,然后粘贴文本..另外,我要求了 3 件事,你提供了 1 @CaiusJard 我已经更新了这个问题。请注意,我如何更新表格而不是表格结构存在问题。感谢您对我编写的用于更新的 C# 代码的回答 是的.. 提供表创建允许我们 a) 查看默认值是否会带来麻烦 b) 准确复制您的表,以便我们可以轻松地在我们的机器中创建一个并尝试重现/修复你的问题 【参考方案1】:

典型的怀疑是,应用程序在运行时使用的数据库实例与您正在检查的数据库实例不同。使用断点验证使用的连接字符串 /w var conn = DbEntity.Database.Connection.ConnectionString (EF6) 或 DbEntity.Database.GetDbConnection().ConnectionString 用于 pre-EFCore 5,或 DbEntity.Database.ConnectionString 用于 EF Core 5。(感谢 Microsoft...)

在您的示例中,完全没有必要使用 TransactionScope,并且在 TransactionScope 可行的情况下,您使用它们的方式是错误的。 TransactionScope 应该是最外层边界,using (var DbEntity = ... 在范围内声明。

TransactionScopes 为处理增加了额外的成本,并将用于协调 DbContext 操作和其他外部操作之间的事务,例如与其他 DbContexts 或其他符合事务提交的服务等的操作/回滚策略。 DbContext 本质上在内部与 Transaction 一起操作,因此无论您在 DbContext 范围内更新多少实体并且它是 SaveChanges 调用,它们都将保存在单个事务中。

【讨论】:

以上是关于实体框架不更新位数据类型的主要内容,如果未能解决你的问题,请参考以下文章

实体框架更改列类型

如何在实体框架中使用 unsigned int / long 类型?

实体框架作为数据库代码的类型检查/验证系统 [关闭]

创建实体框架核心值转换器:属性“备注”属于“字符串”类型,当前数据库提供程序不支持

实体框架数据库错误

C#:更改实体框架的检索数据类型