如何在复杂类型上指定关系?

时间:2012-03-08 04:12:27

标签: entity-framework

我首先使用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,电子邮件,...,CreatedById,ModifiedById,CreatedOn,ModifiedOn,...}

1 个答案:

答案 0 :(得分:1)

复杂类型被视为值对象,并附加到正在创建的表的末尾。因此,用户将拥有列ID,然后是电子邮件,然后是AuditInfo列。唯一的分离是在代码内,而不是在数据库中。因此,复杂类型由其父类跟踪,并且没有外键。如果您正在寻找其他东西,则需要重新考虑您的设计。

更新:

如果您正在寻找的只是为了确保CreatedBy / ModifiedBy被映射为外键约束,那么使用ComplexType似乎是不可能的。您必须将完整的审核信息放在用户表中。这在Complex Type documentation

中指定
  

复杂类型不能包含导航属性。