实体框架抛出奇怪的“无效对象名称”错误

时间:2011-04-21 11:26:00

标签: c# sql-server entity-framework-4

我在执行插入时遇到问题并不断收到错误Invalid object name 'dbo.atomic.address'。正如您在原子数据库中看到的那样,确实存在:

enter image description here

这是CreateAddress函数。我将空值传递给addressline3addressline4。我想知道这可能是问题所在。我检查了.tt模板,Address对象没有将这些标记为Nullable - 问题?

public static int CreateAddress(string addressline1, string addressline2, string addressline3,
        string addressline4, string postcode, int cityid, int countryid, int clientid,
        string tag, bool active, string notes = null)
    {
        using (var ctx = new atomicEntities())
        {
            var a = new Address
                        {
                            ClientId = clientid,
                            AddressTag = tag,
                            AddressLine1 = addressline1,
                            AddressLine2 = addressline2,
                            AddressLine3 = addressline3,
                            AddressLine4 = addressline4,
                            CityId = cityid,
                            Postcode = postcode,
                            CountryId = countryid,
                            AddressNotes = notes,
                            Active = active,
                            Token = DateTime.UtcNow
                        };
            ctx.Connection.Open();
            ctx.Addresses.AddObject(a);
            ctx.SaveChanges();
            return a.AddressId;
        }    
    }

仅供参考,这是我收到的错误:

enter image description here

此外,我插入的数据如下:

enter image description here

BusinessStreet2为空,但我可以确认即使在填充时仍会出现错误。

欢迎任何有关如何完成这项工作的帮助或建议! :D我读过它可能是复数或单数问题,但我看不出我错在哪里?

来自Atomic.edmx的

编辑 Xml:

    <EntityContainer Name="atomicModelStoreContainer">
          <EntitySet Name="address" EntityType="atomicModel.Store.address" store:Type="Tables" Schema="dbo" />
 </EntityContainer>
        <EntityType Name="address">
          <Key>
            <PropertyRef Name="address_id" />
          </Key>
          <Property Name="address_id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
          <Property Name="client_id" Type="int" Nullable="false" />
          <Property Name="address_tag" Type="nvarchar" MaxLength="50" />
          <Property Name="address_line_1" Type="nvarchar" MaxLength="255" />
          <Property Name="address_line_2" Type="nvarchar" MaxLength="255" />
          <Property Name="address_line_3" Type="nvarchar" MaxLength="255" />
          <Property Name="address_line_4" Type="nvarchar" MaxLength="255" />
          <Property Name="city" Type="int" />
          <Property Name="postcode" Type="nvarchar" MaxLength="12" />
          <Property Name="country" Type="int" />
          <Property Name="address_notes" Type="nvarchar" MaxLength="500" />
          <Property Name="active" Type="bit" Nullable="false" />
          <Property Name="token" Type="datetime" />
        </EntityType>

2 个答案:

答案 0 :(得分:2)

经过深刻的讨论,我发现了问题。结果证明这是INSERTUPDATE表格的触发器。卫生署!触发器显然未经测试且完全被遗忘:

CREATE TRIGGER AddressTrigger 
ON [address]
FOR INSERT, UPDATE
AS
DECLARE @Address As Int;
SELECT @Address = i.[address_id] FROM inserted i;
UPDATE [dbo].[atomic].[address]
set
    [token] = GETDATE()
where [address_id] = @Address;
GO

我依稀记得现在自己设置这些,但从那以后就忘记了。请为浪费每个人的时间而道歉!我永远不会在接下来的3个小时里回来!

答案 1 :(得分:0)

在您的映射中看起来像是一个问题,因为如果您的数据库名称为Atomic,则表的正确名称为Atomic.dbo.Address。 EF也不需要将数据库名称添加到对象名称中。