Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6在向sql发送查询时生成额外联接_C#_Entity Framework - Fatal编程技术网

C# 实体框架6在向sql发送查询时生成额外联接

C# 实体框架6在向sql发送查询时生成额外联接,c#,entity-framework,C#,Entity Framework,这是我的框架,由entityframework 6开发: 用户数据模型: [DataContract] [Table("SEC_User")] public class UserDataModel : EntityBase { [DataMember] [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Column("UserID")] public int UserID{get;se

这是我的框架,由entityframework 6开发:

用户数据模型:

[DataContract]
[Table("SEC_User")]
public class UserDataModel : EntityBase
{
    [DataMember]
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("UserID")]
    public int UserID{get;set;}

    [DataMember]
    [Column("UserName")]
    public string UserName{get;set;}

    [DataMember]
    [Column("UserKindRef")]
    public int UserKindRef{get;set;}
    .
    .
    .
}
[DataContract]
[Table("SEC_User_View")]
public class UserViewDataModel : UserDataModel
{
    [DataMember]
    [Column("UserKindTitle")]
    public string UserKindTitle{get;set;}        
}
数据访问方法:

public UserViewDataModel GetByUserName(string userName)
    {
       using (Context)
       {
        return (from entity in Context.EntityList
                 where entity.UserName == userName
                 select entity).FirstOrDefault().ToEntity();
       }
    }
Sql分析器:

exec sp_executesql N'SELECT 
[Limit1].[C1] AS [C1], 
[Limit1].[UserID] AS [UserID], 
[Limit1].[UserName] AS [UserName], 
[Limit1].[UserKindRef] AS [UserKindRef], 
[Limit1].[UserKindTitle] AS [UserKindTitle]
FROM ( SELECT TOP (1) 
    [Extent1].[UserKindTitle] AS [UserKindTitle], 
    [Extent2].[UserID] AS [UserID], 
    [Extent2].[UserName] AS [UserName], 
    [Extent2].[UserKindRef] AS [UserKindRef], 
    ''0X0X'' AS [C1]
    FROM  [dbo].[SEC_User_View] AS [Extent1]
    INNER JOIN [dbo].[SEC_User] AS [Extent2] ON [Extent1].[UserKey] =[Extent2].[UserKey]
    WHERE ([Extent2].[UserName] = @p__linq__0) OR (([Extent2].[UserName] IS NULL) AND (@p__linq__0 IS NULL))
)  AS [Limit1]',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'admin'
不幸的是,当UserViweDataModel从UserDataModel entityframework继承时,entityframework使用select选择SEC_User_视图并将其加入SEC_User,这是错误的。 应该是这样的:

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[UserID] AS [UserID], 
[Extent1].[UserName] AS [UserName], 
[Extent1].[UserKindRef] AS [UserKindRef], 
[Extent1].[UserKindTitle] AS [UserKindTitle]
FROM [dbo].[SEC_User_View] AS [Extent1]
WHERE ([Extent1].[UserName] = @p__linq__0) OR (([Extent1].[UserName] IS NULL) AND (@p__linq__0 IS NULL))',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'admin'
我的错误是什么???

表格(SEC用户)
表格(SEC用户视图)
。你告诉EF你想要两张桌子

EF的默认值是TPH,但是–通过使用
Table
装饰这两个类–您告诉它您想要TPT(请参阅我上面发布的博客文章的第2部分)

顺便说一句,如果您确实想要TPH—听起来像是这样—唯一的表将是基类,而不是派生类。

table(secu用户)
table(secu用户视图)
。你告诉EF你想要两张桌子

EF的默认值是TPH,但是–通过使用
Table
装饰这两个类–您告诉它您想要TPT(请参阅我上面发布的博客文章的第2部分)


顺便说一句,如果您确实想要TPH——听起来像是这样——那么唯一的表将是基类,而不是派生类。

您想做什么?你为什么要继承遗产?这两个类都有一个表和唯一的属性,所以EF不知道所有的都在“SEC_User_View”中,为什么需要这样的基类?首先,它是我的标准框架,可以在所有项目中使用。另一个PointEntityFramework使用视图上的第一个表作为主表,并保存对第一个表的更改(我希望我理解正确),但有时第一个表不是主表。我必须将tablemodel和viewmodel分开。tablemodel用于保存更改,viewmodel用于选择。还有一些时候,为了性能,不必使用“选择列表视图”…您想做什么?你为什么要继承遗产?这两个类都有一个表和唯一的属性,所以EF不知道所有的都在“SEC_User_View”中,为什么需要这样的基类?首先,它是我的标准框架,可以在所有项目中使用。另一个PointEntityFramework使用视图上的第一个表作为主表,并保存对第一个表的更改(我希望我理解正确),但有时第一个表不是主表。我必须将tablemodel和viewmodel分开。tablemodel用于保存更改,viewmodel用于选择。此外,有时为了性能,不必使用“选择列表”视图。。。