ASP.NET MVC - внешний ключ как первичный ключ? - PullRequest
0 голосов
/ 05 октября 2011

Можно ли иметь внешний ключ в качестве первичного ключа? Если да, может ли кто-нибудь помочь мне с моим кодом?

<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. Поскольку зависимая роль относится к ключевые свойства, верхняя граница кратности зависимых Роль должна быть 1 .

Я пытаюсь создать таблицу, которая имеет одну (или ни одну) запись для каждого назначения.

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

Достаточно просто добавить назначение в качестве свойства (извините, синтаксис 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 голосов
/ 07 октября 2011

Да, это возможно.Одним из распространенных примеров может быть таблица для реализации отношения «многие ко многим» между двумя таблицами.Например, Роли и Пользователь будут иметь отношение «многие ко многим», а сочетание двух идентификаторов даст хороший первичный ключ.Уловка - это атрибут 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; }
    ...
}

nullable int (int?) допускает отношение 0 или один, и сгенерированный столбец может иметь значение null.Если это просто int, то столбец не может быть обнуляем, и с ним должно быть связано присвоение.

0 голосов
/ 05 октября 2011

если вы пытаетесь создать таблицу, которая имеет одну (или ни одну) запись для каждого назначения, тогда как у вас есть 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...