【问题标题】:EF Generic Repository Pattern - Insert/Create Method Issue While Inserting Root Entity with Sub EntitiesEF 通用存储库模式 - 插入带有子实体的根实体时的插入/创建方法问题
【发布时间】:2018-05-17 07:26:47
【问题描述】:
public class A
{
    string Id {get; set;}
    string Property_1 {get; set;}
    string Property_2 {get; set;}

    // Foreign Key for Class B
    string B_Id {get; set;}
    // Many to One Relationship
    B objectOfClassB {get; set;}

    // One to Many Relationship
    ICollection<objectOfClassC> listOfClassC {get; set;}
}

我们有一个 A 类对象,我们正在尝试插入它。我们还传递了 B 类和 C 类(列表)的值,它们是 A 类的子实体。

在插入时,我们首先要检查数据库表中是否不存在子实体,即 ObjectofClassB 的值。如果存在,只需将相同的外键添加到 A 类表。

那么我们如何才能防止仅分离或不插入 objectOfClassB(子实体)?

注意 - 我想插入 listOfClassC(另一个子实体)

【问题讨论】:

  • 仅供参考,上面的 A 类对象将从控制器/服务层传递。回购层的代码将是通用的,并将使用(T 实体)进行 CRUD 操作。我们想在回购层进行必要的验证。

标签: c# insert entity-framework-6 primary-key repository-pattern


【解决方案1】:

首先你检查数据库中是否有B类 例如:

var b = dbContext.B.FirstOrDefault()
if(b != null)
{
A.objectOfClassB = b;
//.. do something else or persist
}

用于添加集合 objectOfClassC 只需将其添加到 A.listOfClassC 和添加时 db EF 的“A”将为您在数据库中创建 objectOfClassC 实体。

【讨论】:

  • Stefan,这里的问题是,我们使用的是通用存储库模式,因此我们无法获取特定对象。我们需要严格使用(T 实体)。请在 Repo 中的插入代码下方找到 - public bool Insert(T entity) { bool flag = false;尝试 { if (entity == null) { throw new ArgumentNullException("entity"); } this.Entities.Add(entity); this._context.SaveChanges();标志=真; } }
  • 我真的不明白这是什么问题,在这里。如果您想坚持使用此 GRP 实现并在存储库层进行验证,您应该继承它并覆盖 insert 方法或在服务层中提取 ObjectOfClassB,执行您想要的任何业务逻辑并持久保存 ObjectOfClassA。
  • 提供更多信息,了解问题发生时的确切位置、您希望发生什么以及涉及的所有代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多