Sql EF代码首先不在一对一关系中设置外键
因此,我尝试创建一个简单的产品预览1对1关系,如下所示: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;
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?”可以解决此问题。