【发布时间】:2014-10-02 22:33:23
【问题描述】:
我有两张桌子:
DocumentSet:
setId (int)
name (varchar(50))
DocIdentifier:
docIdId (int)
docSetId (int) <-- (setId from DocumentSet)
customId (char(9))
在两个表上完成的典型查询在 SQL 中如下所示:
SELECT ds.name
FROM DocumentSet ds
INNER JOIN DocIdentifiers di ON ds.setId = di.docSetId
WHERE di.customId == 'someId'
注意命名差异:setId 和 docSetId 是用于外键的列。当我尝试在实体框架中复制它时,问题就来了。我有明显的模型:
class DocumentSet {
public int Id {get;set;}
public string Name {get;set;}
public virtual ICollection<DocumentIdentifier> Identifiers {get;set;}
}
class DocumentIdentifier {
public int Id {get;set;}
public int SetId {get;set;}
public string CustomId {get;set;}
public DocumentSet DocSet {get;set;}
}
再次,为了代码的清晰起见,一些命名差异。所以我为两者创建了EntityTypeConfigurations:
internal class DocumentSetTypeConfiguration : EntityTypeConfiguration<DocumentSet> {
public DocumentSetTypeConfiguration () {
HasKey(f => f.Id);
Property(f => f.Id).HasColumnName("setId");
HasMany(f => f.DocumentIdentifiers);
}
}
internal class DocumentIdentifierTypeConfiguration : EntityTypeConfiguration<DocumentIdentifier> {
public DocumentIdentifierTypeConfiguration () {
ToTable("DocIdentifier");
HasKey(f => f.Id);
Property(f => f.Id).HasColumnName("docIdId");
Property(f => f.SetId).HasColumnName("docSetId");
}
}
问题是:当我发送这样的 LINQ 查询时:
_context.Set<DocumentSet>().Where(d => d.DocumentIdentifiers.Any(pt=>pt.CustomId == customId)).Single();
生成的内容有些拙劣:
SELECT TOP (2)
[Extent1].[SetId] AS [SetId],
[Extent1].[Name] AS [Name]
FROM [dbo].[DocumentSet] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM [dbo].[DocIdentifier] AS [Extent2]
WHERE ([Extent1].[SetId] = [Extent2].[DocumentSet_Id]) AND (([Extent2].CustomId = @p__linq__0) OR (([Extent2].[CustomId] IS NULL) AND (@p__linq__0 IS NULL)))
)
我猜问题在于setId 和docSetId 是不同的名称,但我似乎无法弄清楚如何让EF 看到[Extent2].[DocumentSet_Id] 应该是[Extent2].[docSet_Id]。我在DocumentIdentifierTypeConfiguration 中遗漏了什么可以帮助 EF 理解这一点吗?我以为Property(f => f.SetId).HasColumnName("docSetId"); 行会这样做,但显然不是。
总之,怎么说呢
`DocumentSet has many DocumentIdentifiers with a foreign key relationship of DocumentSet.setId = DocIdentifier.docSetId`?
【问题讨论】:
标签: c# sql linq entity-framework entity-framework-6.1