【问题标题】:Entity Framework not executing Get on every property实体框架未对每个属性执行 Get
【发布时间】:2013-03-28 04:07:13
【问题描述】:

我正在使用实体框架 4.1。一个没有外键的简单表被映射到一个对象(TransmissionHistory 表和对象)。然而,当我保存时,其中一个字段为 NULL,尽管该值已明确设置,并且在浏览代码和编写时我可以看到它到日志。 (字段名称是 WhoDidIt。)

经过进一步调查,我将对象中的自动属性替换为 Get 和 Set 以及私有支持属性。事实证明,当执行数据库 Save 时,执行了其他属性的“Get”,但不是我的问题 WhoDidIt 属性。

这是类定义的一部分:

    public partial class TransmissionHistory
{
    private string _id;
    private string _transmissonTable;
    private string _whoDidIt;

    public string Id
    {
        get { return _id; }
        set { _id = value;  }
    }
    public string TransmissionTable
    {
        get { return _transmissonTable; }
        set { _transmissonTable = value;  }
    }

    public string WhoDidIt
    {
        get { return _whoDidIt; }
        set { _whoDidIt = value;  }
    }

这是创建和保存对象的代码。

        TransmissionHistory trxHist =  new TransmissionHistory();
        trxHist.Id = guid.ToString();
        trxHist.TransmissionTable = "MyTransmission";
        trxHist.WhoDidIt = "Me";
        _db.TransmissionHistories.Add(trxHist);
        _db.SaveChanges();

当我在其中设置断点时,很明显数据库 SaveChanges 正在访问其他两个属性的 Get 方法,而不是 WhoDidIt。所以即使 trxHist 对象在 WhoDidIt 中有一个值,它也总是作为 NULL 保存到数据库中。这是作为“数据库优先”构建的,Visual Studio 构建了该对象。我还尝试删除和重建表并重新生成代码,并更改了字段名称。这里发生了什么?

【问题讨论】:

  • 傻问题:数据库中的表有匹配的列吗?对不起,不得不问。
  • 是的,确实如此。我做了“数据库优先”,所以首先创建了表,然后从表中生成了类。该字段当前为 varchar 12 且可为空 (SQL Server 2008)。最初,它不可为空,并且由于该字段,我的插入失败。
  • 所以您使用的是 EDMX 文件?检查EDMX中的映射,使概念模型的字段映射到存储模型的字段
  • 是的,看起来不错。

标签: entity-framework-4


【解决方案1】:

这个问题自行消失了,但我认为是以下原因造成的:

我们使用的是数据库优先方法。数据库中的基础表已更改,但 EDMX 模型未刷新。尽管这个特定字段没有改变,但在我们从数据库中刷新我们的模型之前,它似乎给出了这种奇怪的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多