C# 两种干扰环境
这不是一个“如何”的问题,而是一个“为什么”和“如何”的问题。事情是这样的,当一个人在他的C# 两种干扰环境,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,这不是一个“如何”的问题,而是一个“为什么”和“如何”的问题。事情是这样的,当一个人在他的assembly中有两个名称空间和两个上下文实现TPT树的不同部分但共享基表时,在调用SaveChanges()时添加新实体失败在具有UpdateException的上下文中:从ObjectStateEntry检索值时出错。有关详细信息,请参阅内部异常。正在抛出。内部异常声明: (41,10):错误3032:映射从行开始的片段时出现问题 41,47:EntityTypes应用程序a.ChildB, app.
assembly
中有两个名称空间
和两个上下文
实现TPT
树的不同部分但共享基表时,在调用SaveChanges()时添加新实体失败
在具有UpdateException的上下文中:从ObjectStateEntry检索值时出错。有关详细信息,请参阅内部异常。
正在抛出。内部异常声明:
(41,10):错误3032:映射从行开始的片段时出现问题
41,47:EntityTypes应用程序a.ChildB,
app.a.ChildA正在映射到同一个
表xBase中的行。映射条件可用于
区分这些类型映射到的行
第一个问题这些行号是什么,它们指的是什么?现在,根据代码:
namespace app
{
public abstract class xBase
{
//...
}
}
namespace app.a
{
public class ChildA : xBase
{
//...
}
public class AContext : DbContext
{
public DbSet<xBase> Base { get; set; }
public DbSet<ChildA> Children { get; set; }
public AContext()
: base("name=AppAContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("PlayGround");
modelBuilder.Configurations.Add(new xBaseConfiguration());
modelBuilder.Configurations.Add(new ChildAConfiguration());
}
public class xBaseConfiguration: EntityTypeConfiguration<xBase>
{
public xBaseConfiguration()
{
//...
this.Map(m => {
m.ToTable("xBase");
});
}
}
public class ChildAConfiguration : EntityTypeConfiguration<ChildA>
{
public ChildAConfiguration ()
{
//...
this.Map(m => {
m.ToTable("AChildren");
});
}
}
}
}
namespace app.b
{
public class ChildB : xBase
{
//...
}
public class BContext : DbContext
{
public DbSet<xBase> Base { get; set; }
public DbSet<ChildB> Children { get; set; }
public BContext()
: base("name=AppBContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("PlayGround");
modelBuilder.Configurations.Add(new xBaseConfiguration());
modelBuilder.Configurations.Add(new ChildBConfiguration());
}
public class xBaseConfiguration: EntityTypeConfiguration<xBase>
{
public xBaseConfiguration()
{
//...
this.Map(m => {
m.ToTable("xBase");
});
}
}
public class ChildBConfiguration : EntityTypeConfiguration<ChildB>
{
public ChildBConfiguration()
{
//...
this.Map(m => {
m.ToTable("BChildren");
});
}
}
}
}
如果将树的任一部分从程序集中排除,则与第二部分一起操作的代码将按需要工作。
现在,它可能与此行为相关,也可能与此行为无关,但由于某种原因,正如我们在异常的消息中所看到的,框架认为层次结构的两个部分都位于同一名称空间中,而事实并非如此,最初是这样,因此我开始分离它们,但没有任何变化,然后我分离了两个上下文使用的连接字符串,但仍然得到相同的行为。值得一提的是,即使只实例化了一个上下文,并且插入了第一个子元素并调用了
SaveChanges()
,也会引发异常。那么,一个上下文如何以及为什么知道另一个名称空间中存在其他实体呢?不过,您希望在DbSet
中输入什么?如果xBase
是抽象的,您永远不能创建实体。@DavidG我不会,它用于查询不创建新实体,例如,可以忽略它。这听起来可能有点奇怪,但您可以尝试将对象附加到上下文并强制添加状态,而不是使用Add()?例如:db.Children.Attach(child);db.Entry(child.State=EntityState.Added
@jcruz抛出的异常非常相同,即使内部异常消息中的行号也是相同的。
using (var db = new AContext())
{
var child = new AChild();
//...
db.Children.Add(child);
db.SaveChanges(); //<--At this point the exception is thrown
}