是否可以将外键作为主键? 如果是这样,有人可以帮我处理我的代码吗?
<Key()>
Public Property AssignmentID() As Integer
<ForeignKey("AssignmentID")>
Public Overridable Property Assignment As Assignment
Public Overridable Property User As User
对于上面的代码,我收到一个错误:
在模型期间检测到一个或多个验证错误 代:
System.Data.Edm.EdmAssociationEnd :: Multiplicity无效 关系中的角色'AssignmentLocks_Assignment_Source' 'AssignmentLocks_Assignment'。因为依赖角色指的是 关键属性,Dependent的多重性的上限 角色必须是 1 。
我正在尝试创建一个每个分配都有一个(或没有)记录的表。
答案 0 :(得分:0)
如果您尝试创建一个每个分配有一个(或没有)记录的表,那么如何在该表中为多行分配AssignmentID?您应该创建一个具有唯一AssignmetnID的表,然后为每个赋值的多个记录创建AssignmetnRecordID。
示例代码在C#中,因为我更熟悉C#语法。
你应该创建一个像这样的数据模型,
public class xyz
{
public int AssignmentID { get; set; }
// Some other properties
[ForeignKey("AssignmetnRecordID")]
public virtual ICollection<Assignment> AssignmentRecords { get; set; }
}
答案 1 :(得分:0)
将分配添加为属性(抱歉C#语法)应该足够了:
public class Xyz
{
public int XyzID { get; set; }
public int AssignmentId { get; set; }
[ForeignKey("AssignmentId")]
public virtual Assignment Assignment { get; set; }
}
public class Assignment
{
public int AssignmentID { get; set; }
}
XyzID和AssignmentID可能不一样,但它只允许0或1分配。
答案 2 :(得分:0)
是的,这是可能的。一个常见示例是用于实现两个表之间的多对多关系的表。例如,角色和用户将具有多对多关系,并且两个ID的组合将成为良好的主键。 技巧是DatabaseGenerate属性,它允许你告诉EF你将生成密钥的值,而不是像identity int字段那样生成数据库。
public class RoleUsers
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column(Order = 0)]
public int RoleId { get; set; }
public virtual Role Role { get; set; }
[Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column(Order = 1)]
public Guid UserGuid { get; set; }
}
但是,在您的情况下,您需要0或1关系,因此您应该
public class MyClass
{
public int Id { get; set; }
public int? AssignmentId { get; set; }
public virtual Assignment Assignment { get; set; }
...
}
nullable int(int?)允许0或1个关系,并且生成的列可以为空。如果它只是int,那么该列不可为空,并且必须有一个关联的Assignement。