gpt4 book ai didi

c# - EF代码中的一个实体多个表首先正确的表名

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:52 24 4
gpt4 key购买 nike

如何从多个数据库表映射到 EF 中的单个实体并获得正确的查询?我有一个用户实体:

public class User
{
public int Id { get; private set; }
public string Name { get; private set; }
public string Surname { get; private set; }
public string Password { get; private set; }
public string Username { get; private set; }
}

实体在上下文中映射:

modelBuilder.Entity<User>().Map(map =>
{
map.Properties(p => new
{
p.Id,
p.Username
});


map.ToTable("UserProfile");
})
// Map to the Users table
.Map(map =>
{
map.Properties(p => new
{
p.Name,
p.Surname
});

map.ToTable("Users");
}).Ignore(user => user.Photo).HasKey(user => user.Id);

此映射生成的 SQL 尝试使用一些错误的表名,例如 User11 而不仅仅是 User 和 UserProfile:

SELECT
[Extent1].[Id] AS [Id],
[Extent3].[Name] AS [Name],
[Extent3].[Surname] AS [Surname],
[Extent1].[Password] AS [Password],
[Extent2].[Username] AS [Username]
FROM [dbo].[User11] AS [Extent1]
INNER JOIN [dbo].[UserProfile] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent1].[Id] = [Extent3].[Id]

最佳答案

SQL 没问题。问题实际上出在您的映射表达式中。

如果您查看映射表达式,您已将所有字段映射到 UserUserProfile 表,密码除外。这将导致 EF6 创建一个额外的表,使用自动生成的名称 User11 来存储未映射的属性(密码)。

为了确认您可以查看 SQL Server 中生成的表,您会注意到 User11 表只有密码属性和一个 ID,当您像上面的示例一样请求所有用户时,EF6 将三个表连接到得到结果(User11、User 和 UserProfile)。

解决方案是更改您的映射表达式以在映射中包含密码字段,例如:

map.Properties(p => new
{
p.Id,
p.Username,
p.Password
});

这将阻止 EF6 生成 User11 表。或者,您可以使用 Ignore(p=>p.Password) 忽略该属性,但在这种情况下这没有任何意义,因为您需要数据库中的密码字段。

如果您不想每次都提取密码字段,则可以在查询中明确排除密码字段。

关于c# - EF代码中的一个实体多个表首先正确的表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26211644/

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