.net - 使用 Entity Framework 代码优先映射属性分隔表时,移动外键字段

标签 .net entity-framework mapping ef-code-first

使用代码优先 EF 映射表时遇到奇怪的问题。我有一个父类“Contract”,它与另一个类“Supplier”的多对一关系。出现了在 Contract 实体中存储契约(Contract)扫描副本的要求。为了避免每次都查询文档字节,我想将此属性存储在一个单独的表中。我可以让 EF 将 ContractDocument 存储在单独的表中,但由于某种原因,供应商的 FK 最终出现在 ContractDocument 表中,而不是父表中。

public class Contract
{
    public Guid Id {get;set;}
    ...
    public virtual ContractDocument Document {get;set;}
    public virtual Supplier Supplier {get;set;}
}

public class ContractDocument
{
    public string MimeType {get;set;}
    public byte[] Data {get;set;}
}

在 DbContext 中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>()
                .Map(m => m.Properties(p => p.Document))
                .ToTable("ContractDocument");
    base.OnModelCreating(modelBuilder);
}

“ContractDocument”表是用正确的属性创建的,并且确实保存了数据。但是,它还包含 FK 字段“Supplier_Id”。 “契约(Contract)”表不再包含任何 FK 字段。

最佳答案

我不确定,目前没有 VS 可以测试,但我认为当您将一个实体拆分为多个表时,您需要映射所有字段,而不仅仅是那些“不寻常”的字段。

尝试将您的映射更新为符合这些行的内容...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>()
                .Map(m => {
                       m.Properties(p => 
                           new {
                              p.Id,
                              p.Document
                           });
                       m.ToTable("ContractDocument");
                    })
                .Map(m => {
                       m.Properties(p =>
                           new {
                              p.Id,
                              /* everything else NOT document */
                           });
                       m.ToTable("Contract");
                    });
    base.OnModelCreating(modelBuilder);
}

修复基于 this

编辑 根据您的评论,听起来您需要定义关系,而不是实体拆分。您有单独的表和单独的类,但缺少它们之间的关系。也许尝试这样的事情。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>().ToTable("Contract");
    modelBuilder.Entity<ContractDocument>().ToTable("ContractDocument");
    modelBuilder.Entity<Contract>()
        .HasOptional(c => c.Document)
        .WithRequiredDependent();

第二次编辑 好吧,要将它作为一个复杂类型来做,我想你需要第一个实体分割图的东西加上一个 modelBuilder.ComplexType<ContractDocument>();行。

关于.net - 使用 Entity Framework 代码优先映射属性分隔表时,移动外键字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434082/

相关文章:

c# - 重命名特定类的库

linq - 多行更新而不选择

mysql - 使用 EF6(和 Code First 迁移)针对不同的数据库系统

mysql - 使用 Doctrine ORM ManyToOne Relationship 在相反方向获取实体

c# - 如何使用 NHibernate 在 CompositeId 映射中设置列

c# - log4net 自定义日志对象和附加程序

c# - 如何让 FileHelpers 在定义的列之后忽略列? (即忽略最后的列)

.net - 值类型会收集垃圾吗?

entity-framework - 将存储过程映射到返回临时表数据的实体

elasticsearch - 如何从Elasticsearch获取自定义分析器源?