2011-10-05 98 views
0

是否有可能有一个外键作为主键? 如果是这样,有人可以帮我用我的代码?ASP.NET MVC - 外键作为主键?

<Key()> 
Public Property AssignmentID() As Integer 
<ForeignKey("AssignmentID")> 
Public Overridable Property Assignment As Assignment 

Public Overridable Property User As User 

对于上面我的代码得到一个错误:

One or more validation errors were detected during model generation:

System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role 'AssignmentLocks_Assignment_Source' in relationship 'AssignmentLocks_Assignment'. Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be �1�.

我试图创建具有一个(或无)每分配记录的表。

+2

这与MVC无关。 –

回答

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; } 
} 
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个赋值。

+0

我想我是以这种错误的方式去做的。多谢你们。 – Tom

0

是的,这是可能的。一个常见的例子是在两个表之间实现多对多关系的表。例如,角色和用户将具有多对多的关系,并且这两个ID的组合将成为一个很好的主键。 诀窍是DatabaseGenerate属性,它允许您告诉EF您将为身份诠释字段的情况生成密钥的值,而不是数据库。

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或一个关系,生成列可为空。如果它只是int,那么该列不能为空,并且必须有一个关联的Assignement。