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