【发布时间】:2017-02-16 14:42:55
【问题描述】:
我有一个预先存在的数据模型,最初使用 EF 4 来访问。更新到 EF 6,遇到配置语法更改的问题,并定义要正确查询的关系。
在这种特定情况下,我的外键关系在 SQL 中生成两列,一列是我定义的,一列是从无到有的......
我有以下两个对象 - Company 和 AppUser:
public class Company : EntityBase, IComparable<Company>
{
public string Name { get; set; }
public virtual IList<AppSystem> AppSystems { get; set; }
public virtual IList<AppUser> AppUsers { get; set; }
public string PortalCustomerName { get; set; }
}
public class AppUser : EntityBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public virtual Company Company { get; set; }
public FlowStatus FlowStatus { get; set; }
public virtual IList<AppUserRole> AppUserRoles { get; set; }
}
public abstract class EntityBase
{
/// <summary>
/// The id assigned by the system.
/// </summary>
public virtual int Id { get; set; }
}
两个类的配置:
public class CompanyConfiguration : EntityTypeConfiguration<Company>
public CompanyConfiguration()
{
ToTable("Company");
Property(c => c.Id).HasColumnName("CompanyID");
Property(c => c.Name).HasMaxLength(50).IsRequired();
Property(c => c.PortalCustomerName).HasMaxLength(50).IsRequired();
HasMany(c => c.AppSystems);
HasMany(c => c.AppUsers);
}
}
public class AppUserConfiguration : EntityTypeConfiguration<AppUser>
{
/// <summary>
/// Initializes a new instance of the <see cref="AppUserConfiguration"/> class with default values.
/// </summary>
public AppUserConfiguration()
{
ToTable("AppUser");
Property(u => u.Id).HasColumnName("AppUserId");
Property(u => u.Email).HasMaxLength(256).IsRequired();
Property(u => u.FirstName).HasMaxLength(50);
Property(u => u.LastName).HasMaxLength(50);
Property(u => u.FlowStatus.Value).HasColumnName("FlowStatus");
HasRequired(u => u.Company).WithMany().Map(m => m.MapKey("CompanyID"));
}
}
当我查询公司时,没问题,我得到匹配的 SQL
SELECT
[Extent1].[CompanyID] AS [CompanyID],
[Extent1].[Name] AS [Name],
[Extent1].[PortalCustomerName] AS [PortalCustomerName]
FROM [dbo].[Company] AS [Extent1]
WHERE N'Joe''s Diner' = [Extent1].[Name]
ORDER BY [Extent1].[Name] ASC
但是,当我查询 AppUsers 时,我遇到了查询问题。通过上面的配置,我得到了对 CompanyId 的正确请求,但我还得到了一个额外的列,Company_Id1:
SELECT
[Extent1].[AppUserId] AS [AppUserId],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[Email] AS [Email],
[Extent1].[FlowStatus] AS [FlowStatus],
[Extent1].[CompanyID] AS [CompanyID],
**[Extent1].[Company_Id1] AS [Company_Id1]**
FROM [dbo].[AppUser] AS [Extent1]
WHERE ([Extent1].[AppUserId] > 0) AND (N'Joe' = [Extent1].[LastName])
但如果我删除映射并仅使用“HasMany()”结束配置,正确的映射就会消失,Company_Id1 变为“Company_Id”:
SELECT
[Extent1].[AppUserId] AS [AppUserId],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[Email] AS [Email],
[Extent1].[FlowStatus] AS [FlowStatus],
[Extent1].[Company_Id] AS [Company_Id]
FROM [dbo].[AppUser] AS [Extent1]
WHERE ([Extent1].[AppUserId] > 0) AND (N'Joe' = [Extent1].[LastName])
我的配置有什么问题?
【问题讨论】:
标签: configuration entity-framework-6 ef-fluent-api