【问题标题】:Guidance On Model Design With Navigation Properties具有导航属性的模型设计指南
【发布时间】:2012-06-26 00:56:00
【问题描述】:

我在 EF 5 中使用 MVC 4 Code First 并尝试规范化一些数据。我将从三个实体开始,并举例说明我的两种不同场景...

用户模型

public class User
{
    public int UserId { get; set; }
    public string PseudoName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public Gender Gender { get; set; }
    public DateTime DateOfBirth { get; set; }

   // Other account related properties....

    public virtual Address Address { get; set; }
    public virtual Profile UserProfile { get; set; }
}

地址模型

public class Address
{
    public int UserLocationId { get; set; }
    public int UserId { get; set; }
    // Address properties
}

个人资料模型

public class Profile
{
    public int UserProfileId { get; set; }
    public int UserId { get; set; }
    // Specific details about the user...
}

我不太熟悉 EF 如何处理事务。通常我会创建一个这样的数据库并启动一个事务,以确保在创建用户时我可以在创建用户时创建用户、个人资料和地址记录。使用 EF 以这种方式执行此操作我必须添加用户并保存它,然后从新生成的用户中检索 userId,然后再调用两个插入并将密钥添加到地址/配置文件模型并保存它们。我对这样做感到厌倦,因为如果在此过程中出现故障,那么用户文件将不完整。现在这是我最初的做法,但不确定这在数据库方面是否可以接受,但到目前为止似乎工作正常,只需要第二个意见。

第二个场景基本上是从 Address 和 Profile 模型中删除外键,我所做的是使用上下文创建我的 User 对象,并在 User 对象中创建一个新的 Profile/Address 属性,然后将对象插入并保存到数据库。 DB 端发生的情况是它创建了一个没有任何 FK 的新配置文件/地址,但在 User 表中添加了 FK 作为 Profile_ProfileId、Address_AddressId。

第二个选项比第一个更有意义吗?

【问题讨论】:

    标签: asp.net-mvc entity-framework transactions ef-code-first


    【解决方案1】:

    EF 足够聪明,可以在单个事务中处理多个相关实体的插入。

    var user = new User { };
    user.Profile = new Profile { };
    user.Address = new Address { };
    context.Users.Add(user);
    context.SaveChanges();
    

    它将计算实体的插入顺序,并使用数据库生成的 PK 值更新属性。

    【讨论】:

    • 是的,如果我按照您在此处列出的特定方式进行操作。我想出了如何在导航属性表而不是主类的表中制作 FK,所以现在这样效果很好。
    猜你喜欢
    • 2011-04-17
    • 2015-11-28
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多