Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql EF代码首先不在一对一关系中设置外键_Sql_Ef Code First_Foreign Keys - Fatal编程技术网

Sql EF代码首先不在一对一关系中设置外键

Sql EF代码首先不在一对一关系中设置外键,sql,ef-code-first,foreign-keys,Sql,Ef Code First,Foreign Keys,因此,我尝试创建一个简单的产品预览1对1关系,如下所示: public class Product : BaseEntity { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string name { get; set; } public virtual EPS eps { get; set;

因此,我尝试创建一个简单的产品预览1对1关系,如下所示:

public class Product : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        
    public Guid Id { get; set; }
    public string name { get; set; }
    public virtual EPS eps { get; set; }
    public virtual Preview preview { get; set; }

    [ForeignKey("userId")]
    public virtual User user { get; set; }
    public Guid userId { get; set; }

}

公共类预览:BaseEntity
{
[密钥、外键(“产品”)]
公共Guid Id{get;set;}
公共字符串imagePath{get;set;}
公共双宽度{get;set;}
公共双倍高度{get;set;}
公共虚拟列表文本{get;set;}
公共虚拟列表图像占位符{get;set;}
[外键(“产品ID”)]
公共虚拟产品产品{get;set;}
公共虚拟Guid ProductId{get;set;}
}
我希望在Previews表中有一个外键指向一个产品 但在运行迁移之后,我只是将其作为常规字段


我做错了什么

你差一点就成功了你只是错过了拼图的一部分

[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
您还需要添加

public Guid ProductId { get; set; }
添加到预览对象

还值得注意的是,ForeignKey属性可以放在任意一个属性上,并且字符串必须引用该对中的另一个

正如当前编写的那样,您正试图让Id属性为相关表上的主键和外键指定值

所以您的最终代码可能看起来像

public class Product : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        
    public Guid Id { get; set; }
    [ForeignKey("User")]
    public Guid UserId { get; set; }
    public string name { get; set; }

    public virtual EPS eps { get; set; }
    public virtual Preview preview { get; set; }
    public virtual User user { get; set; }
}

公共类预览:BaseEntity
{
[关键]
公共Guid Id{get;set;}
[外键(“产品”)]
公共Guid ProductId{get;set;}
公共字符串imagePath{get;set;}
公共双宽度{get;set;}
公共双倍高度{get;set;}
公共虚拟列表文本{get;set;}
公共虚拟列表图像占位符{get;set;}
公共虚拟产品产品{get;set;}
}

作为补充说明,我还建议不要使用像
List
这样的具体集合类型,而应该使用像
IList
ICollection
这样的集合,因为它可以促进更好的代码重用和可扩展性。

你几乎做到了,你只是错过了一个难题

[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
您还需要添加

public Guid ProductId { get; set; }
添加到预览对象

还值得注意的是,ForeignKey属性可以放在任意一个属性上,并且字符串必须引用该对中的另一个

正如当前编写的那样,您正试图让Id属性为相关表上的主键和外键指定值

所以您的最终代码可能看起来像

public class Product : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        
    public Guid Id { get; set; }
    [ForeignKey("User")]
    public Guid UserId { get; set; }
    public string name { get; set; }

    public virtual EPS eps { get; set; }
    public virtual Preview preview { get; set; }
    public virtual User user { get; set; }
}

公共类预览:BaseEntity
{
[关键]
公共Guid Id{get;set;}
[外键(“产品”)]
公共Guid ProductId{get;set;}
公共字符串imagePath{get;set;}
公共双宽度{get;set;}
公共双倍高度{get;set;}
公共虚拟列表文本{get;set;}
公共虚拟列表图像占位符{get;set;}
公共虚拟产品产品{get;set;}
}

作为补充说明,我还建议不要使用像
List
这样的具体集合类型,而应该使用像
IList
ICollection
这样的集合类型,这样可以提高代码的重用性和可扩展性。

感谢您的帮助,但如果我听从你的建议,我最终会出现这样的错误:多重性在关系“Preview\u product”中的角色“Preview\u product\u Source”中无效。因为依赖角色属性不是关键属性,所以依赖角色的多重性的上界必须是“*”。这就是这个问题的解决方法,您现在有一个不同的问题,这里将对此进行解释。。。从本质上说,你有一对一的关系,问题似乎是你想要的是一个0-1对1的关系。。。将guid ProductId设置为可为null的“guid?”可能会解决此问题。感谢您的帮助,但如果我遵循您的建议,我最终会出现以下错误:关系“Preview\u product”中的角色“Preview\u product\u Source”中的多重性无效。因为依赖角色属性不是关键属性,所以依赖角色的多重性的上界必须是“*”。这就是这个问题的解决方法,您现在有一个不同的问题,这里将对此进行解释。。。从本质上说,你有一对一的关系,问题似乎是你想要的是一个0-1对1的关系。。。将guid ProductId设置为空“guid?”可以解决此问题。