导航属性模型设计指南

时间:2012-06-26 00:56:01

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

我正在使用MVC 4 Code First和EF 5并试图规范化一些数据。我将从三个实体开始,并给出我的两个不同场景的例子......

用户模型

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然后调用另外两个插入并将键添加到地址/配置文件模型并保存它们。我觉得这样做会感到厌倦,因为如果一路上发生故障,那么用户文件将无法完成。现在这就是我最初的做法,但不确定这是否可以在数据库方面接受,但到目前为止似乎工作正常,只需要第二个意见。

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

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

1 个答案:

答案 0 :(得分:0)

EF非常聪明,可以在单个交易中处理多个相关实体的插入。

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

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