Asp.net mvc 具有导航特性的模型设计指南

Asp.net mvc 具有导航特性的模型设计指南,asp.net-mvc,entity-framework,transactions,ef-code-first,Asp.net Mvc,Entity Framework,Transactions,Ef Code First,我首先将MVC4代码与EF5一起使用,并尝试对一些数据进行规范化。我将从三个实体开始,并给出两个不同场景的示例 用户模型 public class User { public int UserId { get; set; } public string PseudoName { get; set; } public string FirstName { get; set; } public string LastName { get; set; } pub

我首先将MVC4代码与EF5一起使用,并尝试对一些数据进行规范化。我将从三个实体开始,并给出两个不同场景的示例

用户模型

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如何处理交易。通常,我会创建这样一个DB并启动一个事务,以确保在创建用户时,我可以在创建用户时创建用户、配置文件和地址记录。通过EF这样做,我必须添加用户并保存它,然后从新生成的用户检索userId,然后调用另外两个insert,将键添加到地址/配置文件模型并保存它们。我对这样做感到厌倦,因为如果在这个过程中出现故障,那么用户文件将不完整。下面是我最初是如何做的,但不确定这在DB方面是否可以接受,但到目前为止似乎还可以,只需要第二个意见

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


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

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

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

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

如果我按照您在此处列出的特定方式进行操作,则是的。我知道了如何在导航属性表中而不是在主类的表中创建FKs,所以现在这样做很好。