Этот вопрос связан с этим: Проблемы с расположением матриц в php
Представленные ответы, похоже, работают, но их сложно понять. Очень простой способ решить это - деление и завоевание, то есть, прочитав край, удалите его, и следующее чтение будет намного проще. Посмотрите полное решение на PHP ниже:
#The source number matrix
$source[0] = array(1, 2, 3, 4);
$source[1] = array(5, 6, 7, 8);
$source[2] = array(9, 10, 11, 12);
$source[3] = array(13, 14, 15, 16);
$source[4] = array(17, 18, 19, 20);
#Get the spiralled numbers
$final_spiral_list = get_spiral_form($source);
print_r($final_spiral_list);
function get_spiral_form($matrix)
{
#Array to hold the final number list
$spiralList = array();
$result = $matrix;
while(count($result) > 0)
{
$resultsFromRead = get_next_number_circle($result, $spiralList);
$result = $resultsFromRead['new_source'];
$spiralList = $resultsFromRead['read_list'];
}
return $spiralList;
}
function get_next_number_circle($matrix, $read)
{
$unreadMatrix = $matrix;
$rowNumber = count($matrix);
$colNumber = count($matrix[0]);
#Check if the array has one row or column
if($rowNumber == 1) $read = array_merge($read, $matrix[0]);
if($colNumber == 1) for($i=0; $i<$rowNumber; $i++) array_push($read, $matrix[$i][0]);
#Check if array has 2 rows or columns
if($rowNumber == 2 || ($rowNumber == 2 && $colNumber == 2))
{
$read = array_merge($read, $matrix[0], array_reverse($matrix[1]));
}
if($colNumber == 2 && $rowNumber != 2)
{
#First read left to right for the first row
$read = array_merge($read, $matrix[0]);
#Then read down on right column
for($i=1; $i<$rowNumber; $i++) array_push($read, $matrix[$i][1]);
#..and up on left column
for($i=($rowNumber-1); $i>0; $i--) array_push($read, $matrix[$i][0]);
}
#If more than 2 rows or columns, pick up all the edge values by spiraling around the matrix
if($rowNumber > 2 && $colNumber > 2)
{
#Move left to right
for($i=0; $i<$colNumber; $i++) array_push($read, $matrix[0][$i]);
#Move top to bottom
for($i=1; $i<$rowNumber; $i++) array_push($read, $matrix[$i][$colNumber-1]);
#Move right to left
for($i=($colNumber-2); $i>-1; $i--) array_push($read, $matrix[$rowNumber-1][$i]);
#Move bottom to top
for($i=($rowNumber-2); $i>0; $i--) array_push($read, $matrix[$i][0]);
}
#Now remove these edge read values to create a new reduced matrix for the next read
$unreadMatrix = remove_top_row($unreadMatrix);
$unreadMatrix = remove_right_column($unreadMatrix);
$unreadMatrix = remove_bottom_row($unreadMatrix);
$unreadMatrix = remove_left_column($unreadMatrix);
return array('new_source'=>$unreadMatrix, 'read_list'=>$read);
}
function remove_top_row($matrix)
{
$removedRow = array_shift($matrix);
return $matrix;
}
function remove_right_column($matrix)
{
$neededCols = count($matrix[0]) - 1;
$finalMatrix = array();
for($i=0; $i
Это означает, что приложение не может загрузить EDMX. Существует несколько вещей, которые могут вызвать это.
Короче говоря, нет действительно достаточного количества детали в Вашем вопросе дать точный ответ, но надо надеяться эти идеи должны получить Вас на правильном пути.
Обновление: я записал сообщение в блоге с большим количеством полных шагов для поиска и устранения неисправностей.
Я просто не ссылался на свою библиотеку классов, которая содержала файл EDMX.
Если вы используете edmx из другого проекта, то в строке подключения измените ...
metadata=res://*/Data.DataModel.csdl
... до ...
metadata=res://*/DataModel.csdl
Я только что провел 30 минут с этим. Я переименовал объект entity, переименовал запись в файле конфигурации, но есть еще кое-что ... вы также должны изменить ссылку на csdl
, которую очень легко пропустить - если вы переименовываете, убедитесь, что вы получите все ....
В моем случае это решается изменением свойств файла edmx.
это решило проблему для меня. Проблема в том, что когда контейнер пытается найти метаданные, он не может его найти. так просто сделайте это в той же сборке. это решение не будет работать, если у вас есть файлы edmx в другой сборке
Мне удалось решить эту проблему в Visual Studio 2010, VB.net (ASP.NET) 4.0.
Во время работы мастера модели сущностей вы сможете увидеть строку подключения сущности. Оттуда вы можете скопировать и вставить в строку подключения.
Единственное, чего мне не хватало, это «App_Code». в строке соединений.
entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
У меня была та же проблема 27 сентября 2019.
Мой API находится в Предназначении ядра сети Dot к платформе .NET. edmx находится в другой библиотеке классов, которая находится в платформе .NET только.
я заметил это, когда я пытаюсь назвать это edmx от API.. по некоторым причинам я получил ту ошибку.
то, Что я сделал, перейдите к obj папке API и удалите все. тогда уберите проект API и попробуйте еще раз, и это работало на меня.
The ultimate solution (even after recreating the database on two other machines, as well as the EDMX and other sundries) was to not use the first edition of Entity Framework. Looking forward to evaluating it again in .NET 4.0.
After running into the same problem again and searching all over for an answer, I finally found someone who'd had the same problem. It appears that the connection string wasn't correctly generated by Visual Studio's wizard, and the link to the metadata resources was missing an important path.
v1.0 BUG?: Unable to load the specified metadata resource. Scripts != Models
Update 2013-01-16: Having transitioned to almost exclusively using EF Code First practices (even with existing databases) this problem is no longer an issue. For me, that was a viable solution to reducing the clutter from auto-generated code and configuration and increasing my own control over the product.
Это небольшое изменение помогает решить эту проблему.
У меня есть решение с проектом 3.
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
изменить на
connectionString="metadata=res://*/;
У меня была такая же проблема. Я заглянул в свою соблюдаемую dll с рефлектором и увидел, что имя ресурса неправильное. Я переименовал, и сейчас все в порядке.
У меня была аналогичная ошибка. Я воссоздал проект (длинная история) и вытащил все из старого проекта. Я не осознавал, что моя модель раньше находилась в каталоге под названием «Модель», а теперь находилась в каталоге под названием «Модели». Однажды я изменил соединение в моем Web.Config с этого:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl
на это:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl
Все работало (изменил Model
на Models
). Обратите внимание, что мне пришлось изменить эти три места в этой строке.
Это случилось со мной, когда я случайно переключил действие сборки файла edmx (отображается в разделе «Свойства» в среде IDE) с «EntityDeploy» на «Нет». EntityDeploy - это то, что заполняет метаданные: см. http://msdn.microsoft.com/en-us/library/cc982037.aspx
У меня была такая же проблема и решение, как у Рика, за исключением того, что я импортировал существующий .edmx в новый проект, и хотя базовое пространство имен не имело значения, он был импортирован в другой подкаталог, поэтому мне также пришлось обновить строку подключения в Web.Config в трех местах, чтобы включить различное именование подкаталога:
Моя теория заключается в том, что если у вас есть несколько файлов edmx с одинаковым именем (например, Model1), это исключение будет. У меня возникла такая же проблема, когда я решил назвать все мои файлы edmx (находящиеся в разных проектах) как Model1, потому что я думал, что они должны быть независимыми.
Вы можете получить это исключение, когда Edmx находится в одном проекте, а вы используете его из другого.
Причина в том, что Res://*/
- это uri, который указывает на ресурсы в КУРРЕНТНОЙ сборке. Если Edm определен в сборке, отличной от использующего его кода, res://*/ не будет работать, потому что ресурс не может быть найден.
Вместо указания '*' нужно указать полное имя сборки (включая токен открытого ключа). Например:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
Для построения строк подключения лучше использовать EntityConnectionStringBuilder:
public static string GetSqlCeConnectionString(string fileName)
{
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlServerCe.3.5";
csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
public static string GetSqlConnectionString(string serverName, string databaseName)
{
SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();
providerCs.DataSource = serverName;
providerCs.InitialCatalog = databaseName;
providerCs.IntegratedSecurity = true;
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlClient";
csBuilder.ProviderConnectionString = providerCs.ToString();
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
Если вы все еще сталкиваетесь с исключением, откройте сборку в reflector и проверьте имена файлов .csdl, .ssdl и .msl. Если имена ресурсов отличаются от имен, указанных в значении метаданных, сборка не будет работать.
В моем случае эта проблема была связана с переименованием файла edmx моей модели ... исправление строки подключения app.config для файлов csdl / ssdl / msl устранило мою проблему.
Если вы используете конструктор EF 4.0 для генерации вашего csdl / ssdl / msl, эти 3 «файла» фактически будут храниться в основном файле edmx модели. В этом случае сообщение Вакаса в значительной степени уместно. Важно понимать, что «Model_Name» в его примере нужно будет изменить на любое текущее имя файла .edmx вашей модели (без .edmx).
Кроме того, если ваш файл edmx не находится на корневом уровне вашего проекта, вам необходимо указать имя_модели в начале относительного пути, например
res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl
указывает, что csdl / ssdl / msl xml хранится в файле модели «WidgetModel.edmx», который хранится в папке с именем «MyModel».
Я написал этот вспомогательный класс для создания экземпляров объектов ObjectContext, когда они определены в другом проекте, нежели проект, использующий его. Я анализирую строку подключения в файле конфигурации и заменяю '*' на полное имя сборки.
Он не идеален, потому что он использует отражение для построения объекта, но это самый общий способ сделать это, который я смог найти.
Надеюсь, это кому-то поможет.
public static class EntityHelper<T> where T : ObjectContext
{
public static T CreateInstance()
{
// get the connection string from config file
string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;
// parse the connection string
var csBuilder = new EntityConnectionStringBuilder(connectionString);
// replace * by the full name of the containing assembly
csBuilder.Metadata = csBuilder.Metadata.Replace(
"res://*/",
string.Format("res://{0}/", typeof(T).Assembly.FullName));
// return the object
return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
}
}
Для всех вас, SelftrackingEntities
Пользователи,
если вы следовали инструкциям Microsoft Walk-through и разделили класс контекста объекта на
проект службы wcf (путем ссылки на контекст .tt), поэтому этот ответ предназначен для вас:
часть ответов, представленных в этом сообщении, которая включает такой код, как:
... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
НЕ БУДЕТ РАБОТАТЬ ДЛЯ ВАС !! причина в том, что YourObjectContextType.Assembly
теперь находится в другом Assembley (внутри сборки проекта wcf),
Поэтому вам следует заменить YourObjectContextType.Assembly.FullName
на ->
ClassTypeThatResidesInEdmProject.Assembly.FullName
получайте удовольствие.