#c# #sql-server #entity-framework-4
#c# #sql-сервер #entity-framework-4
Вопрос:
У меня возникли проблемы с выполнением insert и я постоянно получаю ошибку Invalid object name 'dbo.atomic.address'
. Как вы можете видеть, в атомной базе данных адрес действительно существует:
Это CreateAddress
функция. Я передаю нули в addressline3
и addressline4
. Я задавался вопросом, может ли это быть проблемой. Я проверил шаблоны .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;
}
}
Просто для справки, это ошибка, которую я получаю со стеком:
Кроме того, данные, которые я вставляю, следующие:
BusinessStreet2 пуст, но я могу подтвердить, что даже при заполнении ошибка все еще возникает.
Приветствуется любая помощь или предложения о том, как заставить это работать! : D Я читал, что это может быть проблема во множественном или единственном числе, но я не вижу, где я ошибаюсь?
ОТРЕДАКТИРУЙТЕ Xml из Atomic.edmx:
<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>
Ответ №1:
После долгих поисков я нашел проблему. Оказалось, что это триггер в таблице для INSERT
и UPDATE
. Ого! Триггер, очевидно, был непроверен и полностью забыт:
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. Спасибо за этот указатель. У меня была точно такая же проблема — изменил имя таблицы, но почему-то забыл обновить триггеры. Поверьте мне, я потратил более 3 часов на отладку этого, и когда я сдался и погуглил, ваш ответ был правильным. Слава.
Ответ №2:
Похоже, проблема в вашем сопоставлении, потому что, если ваше имя базы данных является Atomic
правильным именем таблицы является Atomic.dbo.Address
. Также EF не нужно добавлять имя базы данных в имя объекта.
Комментарии:
1. Спасибо за ответ. Я думал именно об этом, но понятия не имею, как это изменить? Я искал какие-либо «жестко закодированные» ссылки и не нашел ни одной…
2. Я открываю Atomic.edmx в VS2010 и выполняю обновление из базы данных … ?
3. Если вы откроете файл edmx в формате XML и выполните поиск в базе данных определения адресной таблицы, что вы увидите в имени таблицы и схеме?
4. Я добавил XML в вопрос в качестве редактирования … 🙂 Спасибо за всю вашу помощь до сих пор.