2013-08-04 2 views
0

Я использую System.ComponentModel.DataAnnotations в моих классах домена с EF5 и рамками 4,5Имя свойства Dataannotation Foreignkey против имени столбца?

public class SalesOrderLine : LoggedEntity 
    { 
     [ForeignKey("SalesLine")] 
     [Required] 
     public int SalesLine_Id { get; set; } 
     public SalesLine SalesLine { get; set; } 
    } 

Однако example here использует имя столбца в качестве внешнего ключа, а не имя навигации собственности. Есть ли разница между двумя способами этого?

[

ответ

3

Нет никакой разницы. Оба обычаи делают то же самое.

Это ясно или не ясно, в зависимости от того, используете ли вы EF 5 с .NET 4.0 или с .NET 4.5.

В .NET 4.0 (где ForeignKeyAttribute класс является частью EntityFramework.dll сборки) описание вы увидите в Intellisense (при наведении курсора на атрибут, например) говорит (курсив мной):

Обозначает свойство, используемое в качестве внешнего ключа в отношениях. аннотацию могут быть размещены на ключевом свойстве внешнего и указать связанного навигационное имя свойства, или поместить на навигации свойства и указать соответствующий внешний ключ имя.

В .NET 4.5 (где ForeignKeyAttribute класс был перемещен в System.ComponentModel.DataAnnotations.dll сборки фреймворки) описание стало столь же информативно, как тавтология:

Обозначает имущества, используемые в качестве внешнего ключа в отношения.

1

Пример вы вывесили показывает, как использовать EF Code первой, чтобы создать навигационную свойство менеджера и сопоставляют его типа Person -

public class Project 
{ 
    public int ProjectId { get; set; } 
    public string Name { get; set; } 
    public int ManagerId { get; set; } 
    // The following will use ManagerId as the foreign key and map it to PersonId, or w/e the key field is for person 
    [ForeignKey("ManagerId")] 
    public Person Manager { get; set; } 
} 

Ваш код использует SalesLine_Id установить иностранный ключевое отношение к SalesLine, которое имеет тип SalesLine.

public class SalesOrderLine : LoggedEntity { 
    [ForeignKey("SalesLine")] 
    [Column("SalesLine_Id")] 
    [Required] 
    public int SalesLine_Id { get; set; } 
    public SalesLine SalesLine { get; set; } 
} 

Что важно понять, что вы, вероятно, не должны украсить свой класс со всеми примечаниями, которые вы, если вы не используете нечетное соглашение об именах, потому что EF автоматически сопоставляет все так, как вам хотите, чтобы имена были достаточно согласованными -

public class SalesOrderLine { 
    public int SalesOrderLineId { get; set; } 
    public string Description { get; set; } 
    public int SalesLineId { get; set; } 
    public virtual SalesLine SalesLine { get; set; } 
} 

public class SalesLine { 
    public int SalesLineId { get; set; } 
    public string Description { get; set; } 

    public ICollection<SalesOrderLine> SalesOrderLines { get; set; } 
} 

Было бы неплохо работать в качестве примера. Если вам нужно усложнить отношения, вам, вероятно, нужно будет начать использовать Fluent API для конфигураций, но так же, как и этот код будет работать нормально без dataannotations. Поскольку SalesLineId не является нулевым, он необходим, EF понимает, что это внешний ключ, и все радует.

+0

Интересно. Однако все мои первичные ключи называются ИД, поэтому мне нужно указать EF, на какую таблицу должен сопоставить FK. Я смущен, что есть, по-видимому, два пути, хотя я могу заставить их работать. –

+0

Хорошо, если он еще рано разрабатывать, и вы можете использовать соглашение по умолчанию, я бы использовал «SalesLeadId» вместо SalesLead_Id, что облегчит вам жизнь. –

+0

Почему SalesLeadId лучше, чем SalesLead_Id? –

Смежные вопросы