Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两种干扰环境_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

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
}