【问题标题】: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”。

我正在尝试创建一个表,其中每个作业都有一个(或没有)记录。

【问题讨论】:

  • 这与MVC无关。

标签: 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        相关资源
        最近更新 更多