我在向数据库添加一个包含与现有对象关系的实体时遇到了麻烦。我搜索了很多,但找不到合适的解决方案。我会尽可能简单地描述这个。
public class Store : IEntity
{
public int StoreId { get; set; }
public string StoreName { get; set; }
public virtual Address Address { get; set; }
public virtual Contractor Contractor { get; set; }
}
public class Product : IEntity
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
public virtual Store Store { get; set; }
}
在存储库中,我添加了这样的记录。这是泛型类
public TEntity Add(TEntity entity)
{
using (var context = new TContext())
{
var addedEntity = context.Entry(entity);
addedEntity.State = EntityState.Added;
context.SaveChanges();
return entity;
}
}
现在当我尝试添加这样的新记录时
var store = storeManager.GetBy(x => x.StoreId == 1);
var product = new Product() { ProductName = "Bananas", Store = store };
productManager.Add(product);
productManager.GetAll().ForEach(x => Console.WriteLine(x.ProductName + " " + x.Store.StoreId));
商店关系被添加为新商店,并获得新ID。有人知道我如何解决这个问题吗?
数据库示例:
StoreId StoreName Address_AddressId Contractor_ContractorId
1 NULL 1 1
2 NULL 2 2
3 NULL 3 3
4 NULL 4 4
5 NULL 5 5
6 NULL 6 6
7 NULL 7 7
这是我关于stackoverflow的第一个问题。
问题最可能的原因是您正在为插入操作创建上下文的新实例。因此,这个新上下文不仅获得一个新产品,还获得一个从另一个上下文接收的存储,但这个新创建的上下文并不知道存储已经在数据库中。
一个普遍的问题是管理数据库上下文的生命周期不正确。EF实例与用于接收它们的上下文相关联,您不能只是将实体从上下文放入另一个上下文。
您应该在多个管理器之间共享数据库上下文的实例,而不是在每个管理器操作中创建新上下文。
public class StoreManager
{
public StoreManager( Context context )
{
this.context = context;
}
public TEntity Add(TEntity entity)
{
var addedEntity = context.Entry(entity);
addedEntity.State = EntityState.Added;
context.SaveChanges();
return entity;
}
}
编排必须首先创建上下文,并确保它在两个经理之间共享
var context = new DbContext();
var storeManager = new StoreManager( context );
var productManager = new ProductManager( context );
var store = storeManager.GetBy(x => x.StoreId == 1);
var product = new Product() { ProductName = "Bananas", Store = store };
productManager.Add(product);
productManager.GetAll().ForEach(x => Console.WriteLine(x.ProductName + " " +
x.Store.StoreId));
通常,所有这些都是在单个作用域中创建的,例如在请求作用域中,因此单个web请求具有单个数据库上下文,而每个存储库都获得相同的上下文实例。
您也可以按照官方教程进行操作。
实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯
问题内容: 背景 我将项目中的LINQ-to-SQL代码更改为Entity Framework。大部分更改都相对简单,但是,我遇到了一个相当大的问题。使用LINQ-to- SQL,我能够使用如下存储过程来加载整个对象图(针对模型B): 但是,将这段代码转换为EF之后,在访问ViewModel.Model.ModelBs的行上,出现错误“ EntityCommandExecutionExceptio
我目前正在使用最新版本的实体框架进行一个项目,我遇到了一个似乎无法解决的问题。 当涉及到更新现有对象时,我可以很容易地更新对象属性,直到涉及到引用另一个类的属性为止。 在下面的示例中,我有一个名为Foo的类,它存储各种属性,其中2个是其他类的实例 当我使用下面的Edit()方法时,我传入了我想要更新的对象,并且我可以设法使名称正确更新,但是我还没有找到一种方法来更改子对象的属性。例如,如果子对象的
在我的模型中,我有一个聚合根,每个根都有一个关联的的集合。每个都有一个反向导航属性。 我需要一次获取所有的,这导致在我的中出现以下查询 是来自EF上下文的。 问题是懒惰加载没有实现(我也不想实现它),查询后的属性是。所有的东西都正确地通过EF映射。 要检索具有非空的所有的查询应该是什么? 我用的是EF6。
问题内容: 我已经为Entity Framework 4实现了通用存储库。这是一个简化版本,其中AllAppContainer是EF4对象上下文: 一种方法是QueryCount(),我想将其用作 select Count(*)… SQL行(不返回实际记录)。 直截了当?您可能会想…首先,让我们做同一件事的非存储库版本,对Item实体进行计数: SQL Server Profiler说生成的SQL
我正在使用EF Core(v1.1.3)和C#。 在我的单元测试中,我使用代码优先db模型创建了一个sqlite内存数据库,然后用一些测试数据填充它。但是,当从dB加载实体列表时,相关实体会被填充,尽管没有使用“。包含”。 如果我使用相同的模型来创建一个实际的磁盘数据库,并进行相同的加载,那么只有在使用<代码>时,才会加载相关的实体。包括。 这是sqlite内存实现(v1.1.0)中的错误,还是我