Я пытаюсь преобразовать проект, который в настоящее время использует пользовательскую структуру DAO для использования Entity Framework. Система довольно велика, поэтому изменения в базе данных (SQL Azure DB, если это имеет значение) сами по себе не являются особенно осуществимыми и их следует избегать, если это возможно.C#: Измените метод DataType для Entity Framework
Проблема с колонкой ID. К сожалению, когда система была создана, есть некоторые таблицы, которые имеют тип данных bigint
, а некоторые из них имеют int
, но сами модели все из базового класса, имеющего long
для ID. Предыдущая структура смогла справиться с этой ситуацией, но мне не удалось найти способ сделать это с помощью сущности.
Ниже самый тривиальный пример, который я могу думать:
public class Context : DbContext {
public IDbSet<Foo> Foos {get;set;}
public IDbSet<Bar> Bars {get;set;}
}
public abstract class BaseClass {
public long ID;
}
public class Foo : BaseClass {
...
}
public class Bar : BaseClass {
...
}
SQL Table: Foo
+-------------+
| id : bigint |
| ... |
+-------------+
SQL Table : Bar
+-------------+
| id : int |
| ... |
+-------------+
При попытке загрузить Bar
модель, я получаю эту ошибку:
The 'ID' property on 'BaseClass' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Int64'.
я хотел бы найти способ сообщить системе, что в баре есть ints, в то время как у Foo есть длинные. Я попытался переопределить OnModelCreating
в контексте и определить HasColumnType
для Bar
. Это дало мне новую ошибку:
Schema specified is not valid. Errors:
(105,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Int64[Nullable=False,DefaultValue=]' of member 'ID' in type 'Bar' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' of member 'ID' in type 'CodeFirstDatabaseSchema.Bar'.
мне кажется, что если бы я мог изменить только ожидаемый тип данных для ID
из BaseClass
в int
перед отправкой запроса на сервер, то я должен быть в состоянии вверх -конвертироваться в long
после получения ответа. В идеале я бы хотел сделать это на основе класса.
Может ли кто-нибудь указать мне правильное направление?
Да, этого я и боялся. Я признаю, что пытаюсь исправить ошибку с другой ошибкой. Я просто надеялся, что смогу избежать крупных радикальных изменений с помощью нескольких небольших трюков. Все, что я пробовал, не работает, поэтому я думаю, что смирился с тем, что вы рекомендовали. Если нет лучших решений, я буду отмечать это как правильно. – Merwer
@Merwer Иногда, правда болит, пожалуйста, не стреляйте в мессенджера =) – casperOne
Hi @casperOne Извините, что вступил с моим вопросом, поскольку он по одной и той же теме. Есть ли способ сделать противоположное. У меня есть таблица с идентификатором типа Int. Он становится опасно большим, и мне интересно, есть ли способ изменить его на Лонг? (Объект Framwork CF 6.1) – hjavaher