加载父实体的子实体时出现问题。单向映射和 1 到 0..1 关系与共享主键?

2023-11-30

当我尝试加载父实体的子实体时,它会加载默认值。如果我尝试显式加载它会抛出异常违反多重性约束。关系“CodeFirstNamespace.Association_Customer”的角色“Association_Customer_Target”的重数为 1 或 0..1。检索复杂图的子实体时引发此异常。

我有一个图表协会它有一个子实体Customer具有以下关系一比零或一并有一个独立协会.*首要的关键* is shared。我用的是EF6。延迟加载已启用。

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

顾客类。

public class Customer
{
  public virtual long Id { get; set; } //Shared primary key
  public virtual ICollection<Item> Items {get; set;}
  public virtual ICollection<Complaint> Complaints {get; set;}
  public customer()
  {
    Items = new List<Item>();
    Complaints = new List<Complaint>();
  }
}

映射是单向的:

public class AssociationMapping:EntityTypeConfiguration<Association>
{
   public AssociationMapping() : base()
   {
     HasKey(x => x.Id);
     Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
     Property(x => x.ExternalId).IsRequired();
     Property(x => x.OrganizationId).IsRequired();
     Property(x => x.AssociationType);
     HasOptional(x => x.Customer).WithRequired().WillCascadeOnDelete();
   }
}

public class CustomerMapping : EntityTypeConfiguration<Customer>
{
  public CustomerMapping ():base()
  {
    HasKey(x => x.Id);
    Property(x => x.Id);
    HasMany(x => x.Items)
       .WithOptional()
       .HasForeignKey(key => key.CustomerId)
       .WillCascadeOnDelete();
    HasMany(x => x.Complaints)
      .WithOptional()
      .HasForeignKey(key => key.CustomerId)
      .WillCascadeOnDelete();
  } 
}

当我加载关联实体时,它会完美加载,但当我尝试显式加载 Customer 时,子实体 Customer 会加载默认值,它会引发异常。

 var dbassociation = Single<Association>(x => x.OrganizationId== asso.organizationId && x.ExternalId == asso.ExternalId && x.AssociationType == asso.AssociationType);
 dbassociation.Customer = Single<Customer>(x => x.id == dbassociation.id);

[更新:单一方法]

public TEntity Single<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>>criteria) {
  return Context.Set<TEntity>().SingleOrDefault(criteria);   }

出于测试目的,我尝试通过删除关联类中的 Customer 属性上的虚拟来进行急切加载,并尝试执行以下操作,但它引发了相同的异常

Context.Configuration.LazyLoadingEnabled = false;
Context.Entry<Association>(dbassociation).Reference<Customer>(pa => pa.Customer).Load();

我也尝试过抛出相同的异常

var dbassociation = Context.Set<Association>().Include("Customer").SingleOrDefault(x => x.OrganizationId== asso.organizationId && x.ExternalId == asso.ExternalId && x.AssociationType == asso.AssociationType);

现在我得出的结论是,尽管我使用不同的方法来检索异常,但它是相同的。我猜问题出在映射上。我感谢您的意见和建议。


尝试删除

Customer = new Customer();

来自Association构造函数。实例化导航引用是已知问题的根源(与实例化空导航集合相反,这很好)。这就是为什么你会得到一个Customer与默认值。我不确定它是否也解释了异常,但我可以想象当Association与未初始化的一起加载并附加到上下文Customer由默认构造函数创建的 EF 检测具有无效键的相关实体:Association它有(我假设)一个关键值!=0以及相关的Customer有钥匙==0(因为它从未被初始化为另一个值)。但是,在共享主键关联中,两个键值必须匹配。因为它们不这样做,所以可能会导致异常(但是,异常并不能真正很好地指出问题的根源)。

只是一个猜测。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加载父实体的子实体时出现问题。单向映射和 1 到 0..1 关系与共享主键? 的相关文章

  • 多对多关系更新:无法插入重复键

    首先我还是 EF 代码新手 所以请宽容我 我有这些实体类 public class User public int UserId get set public string UserName get set public string Em
  • Automapper实体框架外键为空

    我正在尝试使用实体框架更新数据库 我使用自动映射器将实体映射到视图模型 并以相同的方式将其映射回来 HttpPost ValidateAntiForgeryToken public ActionResult Edit FromJson My
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • MVC5 实体框架的问题

    我在我的 Web 应用程序中使用 Visual Studio 2013 中的 ASP NET MVC5 Entity Framework 6 我正在尝试我的模型工作 但由于某种原因而出现错误 我已经尝试过 Fluent API 和它自己的模
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 如何将存储过程结果映射到自定义类?

    我在用entity framework 5我已经添加了两个存储过程到我的 edmx model 第一个存储过程返回一个字符串 如果我在 Visual Studio 中打开模型浏览器 我可以更改Returns a Collection Of节
  • 实体框架服务层更新 POCO

    我正在使用Service Layer gt Repository gt Entity Framework Code First w POCO objects方法 我在更新实体方面遇到了困难 我正在使用 AutoMapper 将域对象映射到视
  • Entity Framework Core 中的两个外键

    我在使用 Entity Framework Core 创建数据库时使用代码优先方法 我想创建两个指向同一个表的外键 我的示例显示用户表将保存用户 ID 消息表将保存接收者 ID 和发送者 ID 这意味着两个值必须指向同一个表 用户代码 pu
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • OWIN 可以替代 ASP.NET MVC 应用程序中的 DI 吗?

    大约一年前 在 Visual Studio 中创建时自动生成的 MVC 项目不包含任何有关 OWIN 的内容 作为再次申请并试图了解这些变化的人 我想知道 OWIN 是否可以替代我的 DI 据我了解 Startup Auth cs 中的以下
  • 播种多对多数据

    您好 我正在尝试为我的项目创建一些种子 但我在将多对多关系数据播种到数据库时遇到问题 My database看起来像这样 in 教师技能 教师ID and Skill ID当然是他们的表的外键 My seeder看起来像这样 protect
  • 在同一项目中同时使用 AddDbContextFactory() 和 AddDbContext() 扩展方法

    我正在尝试使用新的DbContextFactory中讨论的模式EF Core 文档的 DbContext 配置部分 https learn microsoft com en us ef core dbcontext configuratio
  • 实体框架代码优先 - 外键约束问题

    我是 EF 代码优先主体的新手 目前不知道该怎么做 我有 2 个 POCO 类 public class Problem public int ProblemID get set public int UserID get set publ
  • 实体类型处于“影子状态”意味着什么?

    在我的 ASP NET Core 1 0 MVC6 EF7 Web 应用程序中 我添加了一个迁移 该迁移添加了新的相关表 和相应的模型 我有以下模型快照 DbContext typeof ApplicationDbContext parti
  • 如何解决“指定的包含路径无效”?

    我有一个相当基本的亲子关系设置 最终结果是我希望能够通过 ASP NET MVC WebAPI 以 JSON 形式返回结果表 我正在使用实体框架 5 0 beta 2 我可以用一个简单的例子来演示我遇到的错误 鉴于课程Category an
  • EF6 不从数据库生成外键关联

    PROBLEM 我正在尝试使用数据库优先方法创建 EF6 模型 简单来说 我有2张桌子tblUser and tblMilkMan上有外键关系UserID柱子 但是当我创建一个新的 EDMX 图并添加 2 个表时 我看不到其中的关系 未创建
  • 防止更新 ASP.NET MVC 和实体框架中未更改的值

    我正在使用 ASP NET MVC 和实体框架 我有一个 编辑人员 网页 可以在其中编辑人员的字段 然后在回发操作中 我使用以下代码 var person objectCtx Persons Where s gt s Id id First
  • 实体框架 SQLite 错误 1:“没有这样的表:__EFMigrationsHistory”

    我在 Windows 和 Linux 上运行 EF Core 并且在两者上都遇到相同的问题 public string DbPath get string DbPath Environment GetFolderPath Environme
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1

随机推荐