Произвольные сопоставления / аннотации данных для уникальных столбцов и свойств навигации с разными именами в Entity Framework 4.1?

#mapping #data-annotations #entity-framework-4.1 #fluent-interface

#сопоставление #данные-аннотации #entity-framework-4.1 #свободный интерфейс

Вопрос:

Во-первых, есть ли способ сообщить EF 4.1, что столбец должен быть уникальным, используя либо аннотации данных, либо fluent API?

Во-вторых, что касается свойств навигации, у меня есть 2 класса Document и User. В классе document у меня есть свойство для идентификатора владельца (userId) и свойство для владельца (User). Как мне сообщить EF 4.1, что OwnerId на самом деле является идентификатором пользователя, а Owner — это свойство навигации, возвращаемое пользователю?

Класс Document:

 public abstract class Document: BaseEntity
    {
        public bool IsActive { get; set; }
        public string Description { get; set; }
        //The UserId
        public Guid OwnerId { get; set; }
        //The User
        public User Owner { get; set; }

    }
  

Комментарии:

1. См msdn.microsoft.com/en-us/library/gg508808 (v = против 98).aspx для примера ключевого свойства, сделанного уникальным с помощью проверки.

Ответ №1:

Entity Framework вообще не поддерживает уникальные ключи, поэтому ответ на ваш первый вопрос — нет.

OwnerId должно быть распознано как внешний ключ для Owner автоматически, если вы не сопоставляете с существующей базой данных, где внешний ключ назван по-другому. В таком случае вы можете использовать, например:

 public abstract class Document: BaseEntity
{
    public bool IsActive { get; set; }
    public string Description { get; set; }
    [Column("UserId"), ForeignKey("Owner")]
    public Guid OwnerId { get; set; }
    public User Owner { get; set; }
}
  

Аннотации данных внешнего ключа, вероятно, не нужны, но вы можете использовать их для явного сопряжения вашего свойства FK со свойством навигации.

В произвольном отображении вы можете использовать:

 modelBuilder.Entity<Document>()
            .Property(d => d.OwnerId)
            .HasColumnName("UserId");
modelBuilder.Entity<Document>()
            .HasRequired(d => d.Owner)
            .WithMany(...)
            .HasForeignKey(d => d.OwnerId);
  

Комментарии:

1. Итак, мои проверки должны будут искать повторяющиеся целые значения, правильно? Это имеет смысл с точки зрения бизнес-концепции, поскольку не всем системам потребуется это требование. Как всегда, отличный ответ!