0

我正在使用带有 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,然后再调用两个插入并将密钥添加到地址/配置文件模型并保存它们。我对这样做感到厌倦,因为如果在此过程中出现故障,那么用户文件将不完整。现在这是我最初的做法,但不确定这在数据库方面是否可以接受,但到目前为止似乎工作正常,只需要第二个意见。

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

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

4

1 回答 1

0

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

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

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

于 2012-06-26T04:05:16.697 回答