C# ASP.NET Core 2.1 EF-一对一关系仅在关系的一侧生成外键约束

C# ASP.NET Core 2.1 EF-一对一关系仅在关系的一侧生成外键约束,c#,entity-framework,asp.net-core,entity-framework-migrations,C#,Entity Framework,Asp.net Core,Entity Framework Migrations,我有以下两种型号: 公共类应用程序用户:IdentityUser { public int?ShoppingCartId{get;set;} 公共购物车购物车{get;set;} } 公共类购物车 { 公共int Id{get;set;} 公共字符串用户标识{get;set;} 公共应用程序用户应用程序用户{get;set;} } 运行Add Migration后,我注意到生成的迁移为AspNetUsers表中的ShoppingCartId列(由ApplicationUser类表示的列)创建

我有以下两种型号:

公共类应用程序用户:IdentityUser
{
public int?ShoppingCartId{get;set;}
公共购物车购物车{get;set;}
}
公共类购物车
{
公共int Id{get;set;}
公共字符串用户标识{get;set;}
公共应用程序用户应用程序用户{get;set;}
}
运行
Add Migration
后,我注意到生成的迁移为
AspNetUsers
表中的
ShoppingCartId
列(由
ApplicationUser
类表示的列)创建了一个FK,但反过来在
ShoppingCart
表的一侧,没有为
UserId
列创建FK


如何解决此问题的任何建议?

如果将
公共应用程序用户ApplicationUser{get;set;}
ApplicationUser作为实体模型的属性,它将为您创建关系


但我不建议您这样做,不要将所有应用程序表与应用程序标识紧密耦合。还建议您将身份验证上下文放在单独的数据库上下文模式上

您的关系是错误的

用户不“拥有”购物车(或者至少它不必拥有,例如在新注册时),购物车“属于”用户。您可能还希望以这样一种方式对其进行建模,即用户(可能不是现在,而是以后)是多个购物车的所有者

因此:

公共类应用程序用户:IdentityUser
{
//Later:公共列表购物车{get;set;}
公共购物车购物车{get;set;}
}
公共类购物车
{
公共int Id{get;set;}
公共字符串用户标识{get;set;}
公共应用程序用户{get;set;}
}

在我的整个数据库模型中,只有一个实体与应用程序标识绑定,那就是
ShoppingCart
,所以这里不是这样。另外,我已经放置了您可以看到的属性。您的建议在生成迁移时给我留下了以下错误:
无法为'ShoppingCart.ApplicationUser'和'ApplicationUser.ShoppingCart'之间的一对一关系确定子/从属方。要识别关系的子/依赖方,请配置外键属性。
修复了它-我必须将
ApplicationUser
属性重命名为
User
。之后,你的建议解决了我的问题,谢谢!在关系模型中,1-1关系通常仅在一个表上使用FK实现。否则,您将无法在许多RDBMS平台上向任一表中插入行。
public class ApplicationUser : IdentityUser
{
    // Later: public List<ShoppingCart> ShoppingCarts { get; set; }
    public ShoppingCart ShoppingCart { get; set; }
}
public class ShoppingCart
{
    public int Id { get; set; }

    public string UserId { get; set; }
    public ApplicationUser User { get; set; }
}