实体框架6.1.1无法使用新的实体来使用Unity of Work Factory和Repository模式

时间:2017-01-16 17:32:58

标签: entity-framework

我在MVC 5 Web API项目中添加了一个新实体,但我无法使用现有的SQL数据库。我现有的代码使用工作单元工厂和存储库模式从数据库读取和写入,所以我知道代码工作。没有edmx文件,所以我认为代码最初是使用代码编写的。以下是我到目前为止所采取的步骤。

步骤1)将新实体添加到我的实体文件夹 步骤2)更新了DbContext文件 步骤3)更新了UnitOfWork.cs文件 步骤4)使用脚本手动创建新的SQL表 步骤5)将以下代码添加到我的Web API服务

using (var uow = _unitOfWorkFactory.Create())
            {

//Code to create newentity object

uow.newEntityRepository.Insert(newentity);
await uow.SaveChangesAsync(); 
}

我没有收到错误。插件根本不会将记录添加到数据库中。

我使用EntityTypeConfiguration创建了一个Entity表映射,并且我使用OnModelCreating Override调用它。

EntityTypeConfiguration

public class NewEntityMap : EntityTypeConfiguration<NewEntity>
    {
        public NewEntityMap() : base()
        {
            // Primary Key
            this.HasKey(t => t.Id);


            // Table & Column Mappings
            this.ToTable("NewEntity", "dbo");
            this.Property(t => t.Id).HasColumnName("Id");
            this.Property(t => t.Created).HasColumnName("Created");
            this.Property(t => t.OfferId).HasColumnName("OfferId");
            this.Property(t => t.MerchantId).HasColumnName("MerchantId");
            this.Property(t => t.ConsumerId).HasColumnName("ConsumerId");
            this.Property(t => t.SMSMessage).HasColumnName("SMSMessage");
            this.Property(t => t.SendSMS).HasColumnName("SendSMS");
            this.Property(t => t.EmailMessage).HasColumnName("EmailMessage");
            this.Property(t => t.SendEmail).HasColumnName("SendEmail");
            this.Property(t => t.Source).HasColumnName("Source");
            this.Property(t => t.FromSMSNumber).HasColumnName("FromSMSNumber");
        }
    }

OnModelCreating

modelBuilder.Configurations.Add(new newEntityMap()); 

我仍然无法在表格中更新记录。

有什么想法吗?提前谢谢!

3 个答案:

答案 0 :(得分:1)

EF代码 - 首先非常简单,所以这应该工作。如果你没有使用迁移,你基本上只需要添加一个新的模型类(匹配你现有的表定义),并将DbSet NewEntities添加到你的DbContext类中,听起来就是这样。

通过消除过程来尝试追踪问题。

  1. 创建一个新的空控制台应用程序项目以进行测试。
  2. static void Main(string[] args)
    {
        MainAsync().Wait();
        Console.ReadLine();
    }
    
    static async Task MainAsync()
    {
        /* Here's where we're gonna start troubleshooting */
    }
    
    1. 引用您的实体项目,并尝试首先使用所有必需/必需的属性实例化Entity类。
    2. static void Main(string[] args)
      {
          MainAsync().Wait();
          Console.ReadLine();
      }
      
      static async Task MainAsync()
      {
          // Test instantiating the Entity
          var newEntity = new NewEntity() { propName: value };
      }
      
      1. 运行项目并确保其有效。如果没有,您的实体就会出现问题。否则,请继续执行步骤4.

      2. 在第2步中的代码的基础上,添加对包含DbContext的项目的引用。现在尝试直接使用DbContext:

      3. static void Main(string[] args)
        {
            MainAsync().Wait();
            Console.ReadLine();
        }
        
        static async Task MainAsync()
        {
            // Test instantiating the Entity
            var newEntity = new NewEntity() { propName: value };
        
            // Now, let's test the Entity with the DbContext directly
            using (var db = new DbContext())
            {
                db.NewEntities.Add(newEntity);
                await db.SaveChangesAsync();
            }
        }
        
        1. 运行/调试上面的代码。如果失败,您应该从EF获得异常。否则,请继续执行步骤6.
        2. 以第4步中的代码为基础。添加对包含存储库的项目的引用。现在,尝试直接使用Repository:
        3. static void Main(string[] args)
          {
              MainAsync().Wait();
              Console.ReadLine();
          }
          
          static async Task MainAsync()
          {
              // Test instantiating the Entity
              var newEntity = new NewEntity() { propName: value };
          
              // Now, let's test the Entity with the DbContext directly
              using (var db = new DbContext())
              {
                  //db.NewEntities.Add(newEntity);
                  //await db.SaveChangesAsync();
          
                  // Now, let's test the entity with the DbContext and the Repository
                  // Adjust the lines below as needed if you're not using a generic repository and/or if your insert method is called something else
                  var repository = new EntityRepository<NewEntity>(db);
                  repository.Insert(newEntity);
                  // Comment out the line below if your repository internally calls SaveChangesAsync() on the DbContext
                  // If your Repository class doesn't have a SaveChangesAsync method, you'll need to add one to test it
                  await repository.SaveChangesAsync();
              }
          }
          
          1. 如果失败,您应该得到一个可以追踪的例外情况。否则,请继续执行步骤8.
          2. 在步骤6中的代码的基础上,添加对包含工作单元工厂的项目的引用(如果尚未引用)。现在,尝试直接使用Unit of Work工厂:
          3. static void Main(string[] args)
            {
                MainAsync().Wait();
                Console.ReadLine();
            }
            
            static async Task MainAsync()
            {
                // Test instantiating the Entity
                var newEntity = new NewEntity() { propName: value };
            
                // Now, let's test the Entity with the DbContext directly
                //using (var db = new DbContext())
                //{
                    //db.NewEntities.Add(newEntity);
                    //await db.SaveChangesAsync();
            
                    // Now, let's test the entity with the DbContext and the Repository
                    // Adjust the lines below as needed if you're not using a generic repository and/or if your insert method is called something else
                    //var repository = new EntityRepository<NewEntity>(db);
                    repository.Insert(newEntity);
                    // Comment out the line below if your repository internally calls SaveChangesAsync() on the DbContext
                    //await repository.SaveChangesAsync();
                //}
            
                // Now, let's test the entity with the UnitOfWork
                var uow = new UnitOfWork();
                uow.NewEntityRepository.Insert(newEntity);
                await uow.SaveChangesAsync();
            }
            
            1. 如果失败,您应该得到一个可以追踪的例外情况。否则,请继续执行步骤10.
            2. 如果以上所有内容都在没有依赖注入的情况下工作,那么我说你的DI容器注册了你的组件。您需要确保为运行时绑定和注册的那些接口的实例(实现)。
            3. 在EF端,确保没有任何外键或虚拟导航属性到其他未正确装饰或未正确填充的实体。此外,请确保传递给定模型的所有必需属性。如果没有通过测试项目运行它,你的应用程序可能会吞下某个地方发生的错误而你只是没有看到它,但是通过上面概述的消除过程,你应该能够找到问题。

              一旦您追踪问题,您可能需要重新考虑在Entity Framework之上使用工作单元和存储库模式,因为它们基本上结合了这两种模式。请参阅this post

              祝你好运。

答案 1 :(得分:0)

您是否使用nuget包管理器控制台生成脚本以更新数据库?

你是:

a)进行迁移&#39;你的项目中的文件夹? b)有一个“迁移历史”&#39;你的数据库中的表? c)是否有数据库.SetInitializer&#39;在你的代码中的任何地方排队?

这些将是您首先运行代码的指标。来自DbContext的代码可能很有用。

答案 2 :(得分:0)

一些事情:

您确定conn字符串指向您期望的数据库吗?

您是否为DbContext添加了一个DbSet for NewEntity?

repository.Insert方法有什么作用?

uow和存储库是否使用了工厂中相同的DbContext实例?或者这些都是上下文的不同实例? (即,IoC设置为不在同一会话中提供相同的实例,或者您正在设置。)