我正在使用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。
第二个选项对第一个选项更有意义吗?
答案 0 :(得分:0)
EF非常聪明,可以在单个交易中处理多个相关实体的插入。
var user = new User { };
user.Profile = new Profile { };
user.Address = new Address { };
context.Users.Add(user);
context.SaveChanges();
它将确定实体的插入顺序,并使用数据库生成的PK值更新属性。