【问题标题】:ASP.NET MVC - Foreign Key as Primary Key?ASP.NET MVC - 外键作为主键?
【发布时间】:2011-10-05 19:25:22
【问题描述】:
是否可以使用外键作为主键?
如果是这样,有人可以帮我写代码吗?
<Key()>
Public Property AssignmentID() As Integer
<ForeignKey("AssignmentID")>
Public Overridable Property Assignment As Assignment
Public Overridable Property User As User
对于上面的代码,我得到一个错误:
在模型过程中检测到一个或多个验证错误
世代:
System.Data.Edm.EdmAssociationEnd: : 多重性在
关系中的角色“AssignmentLocks_Assignment_Source”
'AssignmentLocks_Assignment'。因为从属角色是指
关键属性,Dependent 多重性的上限
角色必须是“1”。
我正在尝试创建一个表,其中每个作业都有一个(或没有)记录。
【问题讨论】:
标签:
vb.net
entity-framework
data-annotations
【解决方案1】:
如果您尝试创建一个表,其中每个作业都有一个(或没有)记录,那么您如何在该表中为多行设置唯一的 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; }
}
【解决方案2】:
只需将赋值添加为属性就足够了(对不起 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 个分配。
【解决方案3】:
是的,这是可能的。一个常见的例子是在两个表之间实现多对多关系的表。例如,角色和用户将具有多对多关系,并且两个 ID 的组合将成为一个很好的主键。
诀窍是 DatabaseGenerate 属性,它允许您告诉 EF 您将为键生成值,而不是像标识 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; }
...
}
可为空的 int (int?) 允许 0 或 1 的关系,并且生成的列可以为空。如果只是 int,则该列不可为空,并且必须有关联的Assignement。