【问题标题】:How to specify a relation on a complex type?如何在复杂类型上指定关系?
【发布时间】:2012-03-08 04:12:27
【问题描述】:

我首先使用 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, ... }

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

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

    更新:

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

    中指定的

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

    【讨论】:

    • 我不明白你的回答。物理上只有一个表,划分只在模型上,我不想将 complexType 作为“实体”本身来管理。
    • 基本上不需要流畅的映射,ComplexType 就足够了。如果您生成模式,您应该会看到这项工作按预期进行。也许您可以更好地澄清您的问题,并提供您想要实现的目标?
    • 我需要映射,否则 CreatedBy 和 ModifiedBy 与 User 类无关,并且我将无法使用 Exception Duplicated User 模式定义运行。基本上我有现有的模型类(用户 + Auditinfo),我正在尝试映射到现有的表用户。
    • 我现在完全糊涂了,因为我之前的评论应该基于您所描述的内容。如果您尝试这样做,您会遇到什么错误?
    • 如果您删除映射,错误是“System.Data.Entity.Edm.EdmEntityType:名称:架构中的每个类型名称必须是唯一的。类型名称“用户”已定义。”。老实说,我不知道没有映射怎么办。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多