我首先使用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,...}
答案 0 :(得分:1)
复杂类型被视为值对象,并附加到正在创建的表的末尾。因此,用户将拥有列ID,然后是电子邮件,然后是AuditInfo列。唯一的分离是在代码内,而不是在数据库中。因此,复杂类型由其父类跟踪,并且没有外键。如果您正在寻找其他东西,则需要重新考虑您的设计。
更新:
如果您正在寻找的只是为了确保CreatedBy / ModifiedBy被映射为外键约束,那么使用ComplexType似乎是不可能的。您必须将完整的审核信息放在用户表中。这在Complex Type documentation
中指定复杂类型不能包含导航属性。