使用 Entity Framework 6 将父实体与数据库中现有的子实体连接起来

Posted

技术标签:

【中文标题】使用 Entity Framework 6 将父实体与数据库中现有的子实体连接起来【英文标题】:Connect parent entity with existing child entity in database using Entity Framework 6 【发布时间】:2021-08-19 17:26:45 【问题描述】:

我正在使用 Entity Framework 6 来设计和使用一个数据库,该数据库具有如下所示的子用户表:

public class User

    public long Id  get; set; 
    public string UserName  get; set; 
    public string CompanyId  get; set; 

还有一个如下所示的 Order 表:

    public class Order

    public long OrderId  get; set; 
    public int ItemCount  get; set; 
    public DateTime OrderDate get; set; 
    ...

    public virtual User User  get; set; 


在我的数据库中,Order表中代表User表的字段是User_Id

现在我的问题(可能是数据库设计问题)是在数据库中创建新用户和订单之前,我想检查用户是否存在,如果存在,请将其链接到新订单创建一个新用户。我有一个方法可以在用户不存在时添加新用户并返回创建的或现有用户的 Id 字段值。

如何创建一个新的 Order 实例,该实例采用 Id 值而不是 User 对象以避免重复用户,或者是否有更好的方法来处理此用例?

我尝试返回对象而不是 UserId,但它在用户表中保存了一个新用户

【问题讨论】:

您应该在User 类中拥有ICollection<Order> Orders 属性。 【参考方案1】:

不确定这是否能解决您的问题。但是这种方式应该确保您不会创建另一个用户对象,而是从 db 中检索一个用户对象。

 public class UserHandler
    
        //Use dbcontext instead to get a user list
        public List<User> UserList = new List<User>();
        public void handleUserList(int id)
        
            User oneUser = UserList.FirstOrDefault(n => n.id==id);
            if (oneUser.Equals(null))
            
                oneUser = new User();
                //Functionality to save the user information
            
        
    

另一个技巧是对属性使用数据注释,以确保它们按照您想要的方式运行。

public class Order

    [Key]
    public long OrderId  get; set; 
    public int ItemCount  get; set; 
    public DateTime OrderDate get; set; 
    ...

    public virtual User User  get; set; 


【讨论】:

我没有问题检查用户是否存在,或者创建一个新用户。问题是每当我保存一个新订单时,它也会保存一个新用户,即使该用户存在(我发送了一个包含 id 的用户,但无论如何都会创建一个新用户)

以上是关于使用 Entity Framework 6 将父实体与数据库中现有的子实体连接起来的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 暂时禁用拦截

《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

使用 Entity Framework 6 创建计算属性

如何在 Entity Framework 6 中使用 DbDataReader 获取表名?

实体未使用 Entity Framework 6 在数据库中更新

Entity Framework Core 6 迁移包执行错误