因此,讓我們假設我有以下實體及其上下文配置設置如下。我省略了很多的屬性爲簡潔起見:一個實體是否可以被多個實體關聯?
public class Company {
public int Id { get; set; }
public Location Location { get; set; }
}
public class Customer {
public int Id { get; set; }
public Location Location { get; set; }
}
public class Location {
public int Id { get; set; }
}
public sealed class EntityDefaultContext : DbContext {
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Company>().HasKey(m => m.Id).ToTable("Company");
modelBuilder.Entity<Company>().Property(m => m.Id).HasColumnName("Id");
modelBuilder.Entity<Company>().HasRequired(m => m.Location).WithRequiredDependent().Map(m => m.MapKey("LocationId"));
modelBuilder.Entity<Customer>().HasKey(m => m.Id).ToTable("Customer");
modelBuilder.Entity<Customer>().Property(m => m.Id).HasColumnName("Id");
modelBuilder.Entity<Customer>().HasRequired(m => m.Location).WithRequiredDependent().Map(m => m.MapKey("LocationId"));
modelBuilder.Entity<Location>().HasKey(m => m.Id).ToTable("Location");
modelBuilder.Entity<Location>().Property(m => m.Id).HasColumnName("Id");
}
}
因此,大家可以看到,無論是公司和客戶的實體持有的位置實體的引用。我相信通常會有的東西。
設置我的DB上下文只是因爲你還可以看到。但是,EF生成的SQL是非常低效的:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[LocationId] AS [LocationId],
[Extent3].[Id] AS [Id1]
FROM
[dbo].[Customer] AS [Extent1]
LEFT OUTER JOIN [dbo].[Company] AS [Extent2] ON [Extent1].[LocationId] = [Extent2].[LocationId]
LEFT OUTER JOIN [dbo].[Company] AS [Extent3] ON [Extent1].[LocationId] = [Extent3].[LocationId]
LEFT OUTER JOIN [dbo].[Company] AS [Extent4] ON [Extent1].[LocationId] = [Extent4].[LocationId]
,當我做這樣的事情這是產生:
var q = from c in defaultContext.Set<Customer>().Include(m => m.Location)
select c;
我做它像這樣的不相關的問題的原因。奇怪的是,這裏是SQL如果我只配置位置實體僅由客戶實體相關聯:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[LocationId] AS [LocationId]
FROM
[dbo].[Customer] AS [Extent1]
INNER JOIN [dbo].[Location] AS [Extent2] ON [Extent1].[LocationId] = [Extent2].[Id]
這是我期望的那樣。這讓我想。 EF不支持這種情況嗎?它怎麼會沒有?
在此先感謝。
這不可能是正確的。當您查詢客戶時,爲什麼它會加入公司?沒有向後導航屬性返回給公司。在派系中,儘管事實上你已經包括了位置,但位置甚至不是查詢的一部分。所以,無論你是在提出錯誤的問題,還是在發生一些非常奇怪的事情。請注意查詢如何在選擇字段中列出Extent3,但未在From中定義Extent3? –
爲什麼你將它映射爲一對一?嘗試將其映射爲一對多,其中位置可以有多個客戶和公司。 –
@MystereMan你說得對。這是我的錯誤。我爲第二個示例發佈了不正確的代碼片段。我現在修好了。 – 9ee1