7

Я пытаюсь преобразовать проект, который в настоящее время использует пользовательскую структуру 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 после получения ответа. В идеале я бы хотел сделать это на основе класса.

Может ли кто-нибудь указать мне правильное направление?

ответ

4

Хотя вы можете неявным образом нарисовать bigint to an int in SQL Server, кажется, что EDM-типы Entity Framework (на самом деле это то, с чем вы имеете дело) не позволяют неявное преобразование из 64-разрядного целочисленного типа в 32-разрядный целочисленный тип.

Это, вероятно, не зря, потому что вы можете легко переполнить и иметь значения, которые не соответствуют полям int.

При этом вы должны иметь два базовых класса: один для идентификатора int и один для идентификатора long. Это некрасиво, но это обеспечивает логику, которую вы определенно хотите; вы не сможете хранить значения, которые больше, чем то, что может поместиться в int в базе данных, так почему бы вам захотеть сделать это на уровне кода? Структура Entity делает правильные вещи здесь, не позволяя вам применить это преобразование.

+0

Да, этого я и боялся. Я признаю, что пытаюсь исправить ошибку с другой ошибкой. Я просто надеялся, что смогу избежать крупных радикальных изменений с помощью нескольких небольших трюков. Все, что я пробовал, не работает, поэтому я думаю, что смирился с тем, что вы рекомендовали. Если нет лучших решений, я буду отмечать это как правильно. – Merwer

+0

@Merwer Иногда, правда болит, пожалуйста, не стреляйте в мессенджера =) – casperOne

+0

Hi @casperOne Извините, что вступил с моим вопросом, поскольку он по одной и той же теме. Есть ли способ сделать противоположное. У меня есть таблица с идентификатором типа Int. Он становится опасно большим, и мне интересно, есть ли способ изменить его на Лонг? (Объект Framwork CF 6.1) – hjavaher

Смежные вопросы