Как указать отношение к сложному типу? - PullRequest
1 голос
/ 08 марта 2012

Сначала я использую код EF для определения двух отношений в сложном типе с неудачным результатом исключения InvalidOperation "{" Выражение 'p => p.AuditInfo.CreatedBy' не является допустимым выражением свойства. Выражение должно представлять свойство: C #: 't => t.MyProperty' VB.Net: 'Function (t) t.MyProperty'. "}"

Что я делаю не так?

Соответствующий код:

public class AuditInfo
{
    public DateTime? CreatedOn { get; internal set; }
    public Guid? CreatedById { get; internal set; }
    public User CreatedBy { get; internal set; }

    public DateTime? ModifiedOn { get; internal set; }
    public Guid? ModifiedById { get; internal set; }
    public User ModifiedBy { get; internal set; }

    public byte[] ModifiedTimestamp;
}

public class User
{
    public Guid Id { get; internal set; }
    public string Email { get; internal set; }

    public AuditInfo AuditInfo { get; internal set; }
}

class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        this.HasOptional(p => p.AuditInfo.CreatedBy).WithMany().HasForeignKey(p => p.AuditInfo.CreatedById);
        this.HasOptional(p => p.AuditInfo.ModifiedBy).WithMany().HasForeignKey(p => p.AuditInfo.ModifiedById);
    }
}

public class Test3DbContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<AuditInfo>();
        modelBuilder.Configurations.Add(new UserMap());
    }
}

Таблица базы данных:

Пользователь {Id, Email, ..., CreatedById, ModifiedById, CreatedOn, ModifiedOn, ...}

1 Ответ

1 голос
/ 08 марта 2012

Сложный тип обрабатывается как объект значения и добавляется в конец создаваемой таблицы.Таким образом, у пользователя будут столбцы Id, затем электронная почта, а затем столбцы AuditInfo.Единственное разделение внутри кода, а не в базе данных.Поэтому сложные типы отслеживаются их родительским классом и не имеют внешних ключей.Вам нужно переосмыслить свой дизайн, если вы ищете что-то еще.

ОБНОВЛЕНО:

Если то, что вы ищете, это просто для того, чтобы убедиться, что CreatedBy / ModifiedBy отображен для ограничений внешнего ключа, то кажется, что это невозможно при использовании ComplexType.Вы должны будете поместить полную информацию аудита в пользовательскую таблицу.Это указано в документации Complex Type

Составной тип не может содержать навигационные свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...