C# 为什么我的一对零一关系总是与实体框架产生内部连接?
我的分类声明如下:C# 为什么我的一对零一关系总是与实体框架产生内部连接?,c#,entity-framework,linq,entity-framework-6,C#,Entity Framework,Linq,Entity Framework 6,我的分类声明如下: [Table("Profil")] public class Profil { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] [Column("CodeUtilisateur")] [MaxLength(25)] public string UtilisateurId { get; set; } public string Nom { get; set; } p
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
[ForeignKey("UtilisateurId")]
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
}
这是我的linq查询
var query = from profil in icDbContext.Profils
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = profil.User != null ? profil.User.Email : ""
};
var result = query.ToList();
发送到数据库的查询将生成与视图[dbo].[vwADUser]的内部联接
SELECT
1 AS [C1],
[Extent1].[Nom] AS [Nom],
[Extent1].[Prenom] AS [Prenom],
[Extent1].[CodeUtilisateur] AS [CodeUtilisateur],
[Extent2].[Mail] AS [Mail]
FROM [ic].[Profil] AS [Extent1]
INNER JOIN [dbo].[vwADUser] AS [Extent2] ON [Extent1].[CodeUtilisateur] = [Extent2].[UserName]
我也尝试过这个查询,得到了相同的结果
var query = from profil in icDbContext.Profils
join user in icDbContext.Users on profil.UtilisateurId equals user.UserName into gusers
from guser in gusers.DefaultIfEmpty()
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = guser != null ? guser.Email : ""
};
var result = query.ToList();
我尝试使用此命令的几个变体手动配置关系,但没有成功
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User)
.WithOptionalDependent();
modelBuilder.Entity()
.has可选(x=>x.User)
.使用OptionalDependent();
您知道如何配置我的关系以生成左连接而不是内部连接吗?请尝试以下方法:
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
[ForeignKey("Profil")]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
public virtual Profil Profil {get;set;}
}
这就是你如何流利地完成它:
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User) // User is optional for Profil
.WithRequired(z=>z.Profil); // but Profil is required for User
modelBuilder.Entity()
.HasOptional(x=>x.User)//用户对于Profil是可选的
.WithRequired(z=>z.profile);//但用户需要Profil
您的类似乎缺少一些字段。您的外键SQL列是什么数据类型?(是否允许空值)数据类型是一个字符串,它是UsilizateUrid属性。此列是该表的键,但也是另一个表的外键。而官方文档中的左外连接示例对您不起作用?我试过了,但还是遇到了同样的内部连接问题。我已经更新了描述以添加此示例。它起作用了。我必须反转外键声明。但请告诉我,是否可以在两侧都有可选关系,或者我必须根据需要至少声明一侧?我不确定,因为我从未需要实现0..1:0..1关系。多对多,是的。