Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
通过实体框架将派生类属性传递给SQL Server_Sql_Entity_Derived - Fatal编程技术网

通过实体框架将派生类属性传递给SQL Server

通过实体框架将派生类属性传递给SQL Server,sql,entity,derived,Sql,Entity,Derived,从SQL Server检索对象列表时,出现以下错误: System.Data.SqlClient.SqlException 列名“AccountName”无效 列名“AccountNumber”无效 我知道数据库不包含这些列,但我认为我的代码不应该传递这些列进行检索 我有一个从实体框架代码派生的类,第一个类添加了一些额外的属性 出于某种原因,当我调用数据库时,它会将由TransactionHistoryGrid类创建的额外属性传递给SQL Server,而它应该只传递TransactionHis

从SQL Server检索对象列表时,出现以下错误:

System.Data.SqlClient.SqlException
列名“AccountName”无效
列名“AccountNumber”无效

我知道数据库不包含这些列,但我认为我的代码不应该传递这些列进行检索

我有一个从实体框架代码派生的类,第一个类添加了一些额外的属性

出于某种原因,当我调用数据库时,它会将由
TransactionHistoryGrid
类创建的额外属性传递给SQL Server,而它应该只传递
TransactionHistory
属性

代码如下:

实体框架代码第一类:

public partial class TransactionHistory : Transaction
{
    public string BillingAddressCity { get; set; }
    public string BillingAddressCompany { get; set; }
    public string BillingAddressCountry { get; set; }
    public string BillingAddressFax { get; set; }
    public string BillingAddressFirst { get; set; }
    public string BillingAddressLast { get; set; }
    public string BillingAddressPhone { get; set; }
    public string BillingAddressState { get; set; }
    public string BillingAddressStreet { get; set; }
    public string BillingAddressZip { get; set; }

    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    public Address BillingAddress { get; set; }

    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    public Address ShippingAddress { get; set; }

    public System.Guid ID { get; set; }
    public virtual Account Account { get; set; }
}
类来填充剑道网格:

public class TransactionHistoryGrid : TransactionHistory
{
    public string AccountName { get; set; }
    public string AccountNumber { get; set; }

    public static List<TransactionHistoryGrid> GetTransactionHistoryGrid()
    {
        List<TransactionHistoryGrid> grids = new List<TransactionHistoryGrid>();

        // This is where the trouble begins:
        foreach (TransactionHistory t in GetAllTransactionHistories())
        {
            // It doesn't make it this far.
            var grid = new TransactionHistoryGrid()
            {
                Account = t.Account;
                AccountName = t.Account.AccountName;
                AccountNumber = t.Account.AccountNumber;
            };
            grids.Add(grid);
        }
        return grids;
    }
}

如果这些是您的EF模型,并且属性不是数据库结构的一部分,则应使用[NotMapped]属性注释属性,以便sql生成不会拾取属性并尝试将其添加到select语句中

希望这个网站能帮助解释注释。

我个人更喜欢将数据库模型转换为视图模型。通过这种方式,我可以确保任何非数据库属性都可以在项目的“数据收集层”部分之外进行管理


我不是EF人,因为我更喜欢使用Telerik的DataAccess作为我的ORM解决方案。

一目了然。我得说问题一定是由账户实体引起的。不是事务或事务历史记录。尝试获取帐户的数据库集,看看是否出现相同的错误。如果没有,请检查上下文中是否设置了延迟加载,或者尝试显式地包括帐户


我应该补充一点,如果您无法取回帐户(具有AccountName和AccountNumber),那么您需要再次检查EDMX模型中的帐户,并将其与您正在访问的实际数据存储进行比较。在这种情况下,这两个可能是不同步的,考虑到您的模型仍然认为AccountName和AccountNumber在其中,我会说它在数据存储端


1) 确保实际数据存储在Accounts表中具有AccountName和AccountNumber字段

2) 确保EDMX中的帐户实体映射到同一帐户表


3) 确保AccountName和AccountNumber的帐户实体属性映射到相同的AccountName和AccountNumber字段


我之所以提到这一点,是因为我以前在从开发环境切换到登台环境时遇到过这种情况。数据存储区不同,但EDMX不知道。从注释线程重新发布:

如所述的类型发现可能正在发挥作用。属性 具有AttributeTargets.Class、AttributeTargets.Property和AttributeTargets.Field标志,因此除非您打算直接通过DatabaseContext操作TransactionHistoryGrid属性,否则您可以将该属性放在整个类上

[NotMapped]
public class TransactionHistoryGrid : TransactionHistory
{
    ...
}

另一种方法是将TransactionHistoryGrid类移动到另一个程序集中。

Account实际上是表列的一部分。为了在这里发布,我省略了一些代码。我在其他属性上使用[NotMapping],效果很好。当直接调用GetAllTransactionHistories()方法时,一切正常,但当我尝试在TransactionHistoryGrid类(从TransactionHistory类派生)中调用时,它会抛出错误。出于某种原因,它正在传递从enityt framework分部类派生的类的“添加”属性,但我不明白它是如何或为什么这样做的。如果我无法按照设置的方式实现这一点,我将求助于通过视图模型返回数据,但我只是很好奇为什么这不起作用。感谢您的回复。仔细查看您突出显示的代码,当您尝试检索事务历史记录集合时,会引发问题。这看起来像是从事务派生的,那么这个类中有什么呢?这里也有这些房产吗?另外,如果对通过SSMS或Visual Studio(如果您有intellitrace选项)生成的sql运行探查器,事务(AuthorizeNet类)有大约30个我不想重新创建的属性,那么会发生什么情况,因此在Enity Framework分部类中,我继承了Transaction类,所以实体代码首先将为我完成所有工作。我还向它添加了一些额外的属性。那很好用。在我尝试使用带有附加属性的TransactionHistoryGrid类之前,一切都很正常。我将更新代码以反映TransactionHistory类。还将运行配置文件并查看SQL在说什么请参见下面的JimmySweets注释。结果显示属性正在尝试映射。帐户实体不是问题所在。我添加到TransactionHistoryGrid类中的任何属性都会传递到GetAllTransactionHistories()方法,因此会抛出错误,因为SQL找不到列。TransactionHistory.Account会很好地返回,它的属性也是如此。但是当TransactionHistoryGrid(从TransactionHistory派生)添加了任何属性时,这些属性将如何传递给GetAllTransactionHistories()方法,因此导致SQL错误,因为SQL中不存在这些列。我的想法是:TransactionHistoryGrid根本不应该起作用,因为您将调用封装在它自己的方法中。实际上,您没有进行任何直接转换,也没有将其用作上下文中的类型参数。因此,这里只有三个实体,事务、事务历史和帐户。事务是否可能有AccountName和AccountNumb
public ActionResult TransactionHistory_Read([DataSourceRequest]DataSourceRequest request = null)
{
    List<TransactionHistoryGrid> transactionHistory = TransactionHistoryGrid.GetTransactionHistoryGrid();            

    DataSourceResult result = transactionHistory.ToDataSourceResult(request);
    return Json(result, JsonRequestBehavior.AllowGet);
}
SELECT 
    1 AS [C1], 
    [Extent1].[Discriminator] AS [Discriminator], 
    ...
    [Extent1].[AccountName] AS [AccountName], 
    [Extent1].[AccountNumber] AS [AccountNumber], 
    [Extent1].[Account_ID] AS [Account_ID], 
    [Extent1].[BillingStatement_ID] AS [BillingStatement_ID]
    FROM [dbo].[TransactionHistories] AS [Extent1]
WHERE [Extent1].[Discriminator] IN (N'TransactionHistoryGrid',N'TransactionHistory')
[NotMapped]
public class TransactionHistoryGrid : TransactionHistory
{
    ...
}