当使用实体框架代码优先映射属性到单独的表时,移动外键字段

2023-12-23

使用代码优先 EF 映射表时遇到奇怪的问题。我有一个父类“Contract”,与另一个类“Supplier”具有多对一关系。要求在合同实体中存储合同的扫描副本。为了避免每次都查询文档字节,我想将此属性存储在单独的表中。我可以让 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;}
}

在数据库上下文中:

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 http://msdn.microsoft.com/en-us/library/hh295845%28v=vs.103%29.aspx

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

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

2nd Edit好的,要做成一个复杂的类型,我认为你需要第一个实体分割地图的东西加上一个modelBuilder.ComplexType<ContractDocument>(); line.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当使用实体框架代码优先映射属性到单独的表时,移动外键字段 的相关文章

随机推荐