【问题标题】:Ignore properties in data model while keeping them in EF Core migrations and Database Tabel忽略数据模型中的属性,同时将它们保留在 EF Core 迁移和数据库表中
【发布时间】:2020-07-03 08:41:26
【问题描述】:

我的模型中有属性,例如

public class Test{
        public int Id{ get; set; }
        public string Title { get; set; }
        public DateTime? CreatedDate { get; set; }
        public DateTime? ModifiedDate { get; set; }
        public DateTime? DeletedDate { get; set; }
}

在这里,我正在使用这个测试类使用迁移在数据库中创建表, 现在表已成功创建,但问题是当我想使用像“Select Title from Test where Id=1”这样的存储过程进行任何操作时,当我运行这个时,我遇到了这样的错误

“所需的列 'CreatedDate' 未出现在结果中 'FromSql' 操作"

我用过

  1. NotMapped 属性工作正常,但是当我添加另一个迁移时,更新数据库后 NotMapped 属性会从数据库中删除

  2. 还可以使用 Shadow 属性和 Ignore 等属性

      protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         modelBuilder.Entity<Test>().Property<DateTime?>("CreatedDate");
         modelBuilder.Entity<Test>().Property<DateTime?>("ModifiedDate");
         modelBuilder.Entity<Test>().Property<DateTime?>("DeletedDate");
     }
    

也试试这个,

protected override void OnModelCreating(ModelBuilder modelBuilder) {  
 modelBuilder.Entity<Test>().Ignore(x => x.DeletedDate);  
 modelBuilder.Entity<Test>().Ignore(x => x.IsDeleted);  
 modelBuilder.Entity<Test>().Ignore(x => x.ModifiedDate); }

但问题还是一样,

所以问题是我想在执行数据库操作时忽略 CreateDate、ModifiedDated、DeletedDated 属性,并且在添加和更新新迁移时也不想从数据库中删除这些列。

【问题讨论】:

  • 我的回答对您解决问题有帮助吗?如果是,请接受它作为答案,它将帮助遇到同样问题的其他人,如果不是,请告诉我您的问题。

标签: asp.net-core stored-procedures entity-framework-core ef-code-first


【解决方案1】:

“所需的列 'CreatedDate' 未出现在结果中 'FromSql' 操作"

首先你要知道,这个错误的根本问题不是你的CreatedDate字段,而是你执行FromSql后返回的类型

执行FromSql时,返回类型为Test,Test类型包含所有字段(Id,Title,CreatedDate...),但是你的存储过程只选择Title字段,因此接收到的类型不匹配,就会出现这个错误。

你可以通过两种方法解决这个问题。

第一种方法是改变存储过程,返回与Test类型一致的数据。

Select * from Test where Id=1

另一种方法从receiving types的角度变化。

您可以自定义 FromSql 方法,使返回的类型动态

 public static class CustomFromSqlTest
    {
        public static IEnumerable<dynamic> FromSql(this DbContext dbContext, string Sql, Dictionary<string, object> Parameters)
        {
            using (var cmd = dbContext.Database.GetDbConnection().CreateCommand())
            {
                cmd.CommandText = Sql;
                if (cmd.Connection.State != ConnectionState.Open)
                    cmd.Connection.Open();

                foreach (KeyValuePair<string, object> param in Parameters)
                {
                    DbParameter dbParameter = cmd.CreateParameter();
                    dbParameter.ParameterName = param.Key;
                    dbParameter.Value = param.Value;
                    cmd.Parameters.Add(dbParameter);
                }

                //var retObject = new List<dynamic>();
                using (var dataReader = cmd.ExecuteReader())
                {

                    while (dataReader.Read())
                    {
                        var dataRow = GetDataRow(dataReader);
                        yield return dataRow;

                    }
                }
            }
        }

        private static dynamic GetDataRow(DbDataReader dataReader)
        {
            var dataRow = new ExpandoObject() as IDictionary<string, object>;
            for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++)
                dataRow.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]);
            return dataRow;
        }
    }

使用它:

  var result = _context.FromSql("spName @Id", new Dictionary<string, object> { { "@Id", 1 } }).ToList(); 

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2019-08-03
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多