gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:10:24 26 4
gpt4 key购买 nike

使用代码优先 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com