我在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());
我仍然无法在表格中更新记录。
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
EF代码 - 首先非常简单,所以这应该工作。如果你没有使用迁移,你基本上只需要添加一个新的模型类(匹配你现有的表定义),并将DbSet NewEntities添加到你的DbContext类中,听起来就是这样。
通过消除过程来尝试追踪问题。
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
static async Task MainAsync()
{
/* Here's where we're gonna start troubleshooting */
}
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
static async Task MainAsync()
{
// Test instantiating the Entity
var newEntity = new NewEntity() { propName: value };
}
运行项目并确保其有效。如果没有,您的实体就会出现问题。否则,请继续执行步骤4.
在第2步中的代码的基础上,添加对包含DbContext的项目的引用。现在尝试直接使用DbContext:
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();
}
}
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();
}
}
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();
}
在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设置为不在同一会话中提供相同的实例,或者您正在设置。)