使用代码优先 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(使用前将#替换为@)