Для Entity Framework 5.0.0.0 - 6.1.3
Вы действительно хотите сделать следующее:
1. using System.Data.Entity; to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);
Да, Matt Frear верен. UPDATE -EDIT: Предостережение заключается в том, что я согласен с другими в том, что вместо добавления этого кода в global.asax добавлен в ваш класс DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// other code
Database.SetInitializer<YOURContext>(null);
// more code
}
. Как уже отмечалось, это хорошо для обработки модульного тестирования.
В настоящее время я использую это с Entity Framework 6.1.3 /.net 4.6.1
Вот что-то, что я записал для почти идентичного стека (мы должны были стандартизировать названия производителя аппаратных средств и были все виды изменений). Это - сторона клиента, хотя (VB.Net, чтобы быть точным) - и используют алгоритм расстояния Левенштейна (измененный для лучших результатов):
Public Shared Function FindMostSimilarString(ByVal toFind As String, ByVal ParamArray stringList() As String) As String
Dim bestMatch As String = ""
Dim bestDistance As Integer = 1000 'Almost anything should be better than that!
For Each matchCandidate As String In stringList
Dim candidateDistance As Integer = LevenshteinDistance(toFind, matchCandidate)
If candidateDistance < bestDistance Then
bestMatch = matchCandidate
bestDistance = candidateDistance
End If
Next
Return bestMatch
End Function
'This will be used to determine how similar strings are. Modified from the link below...
'Fxn from: http://ca0v.terapad.com/index.cfm?fa=contentNews.newsDetails&newsID=37030&from=list
Public Shared Function LevenshteinDistance(ByVal s As String, ByVal t As String) As Integer
Dim sLength As Integer = s.Length ' length of s
Dim tLength As Integer = t.Length ' length of t
Dim lvCost As Integer ' cost
Dim lvDistance As Integer = 0
Dim zeroCostCount As Integer = 0
Try
' Step 1
If tLength = 0 Then
Return sLength
ElseIf sLength = 0 Then
Return tLength
End If
Dim lvMatrixSize As Integer = (1 + sLength) * (1 + tLength)
Dim poBuffer() As Integer = New Integer(0 To lvMatrixSize - 1) {}
' fill first row
For lvIndex As Integer = 0 To sLength
poBuffer(lvIndex) = lvIndex
Next
'fill first column
For lvIndex As Integer = 1 To tLength
poBuffer(lvIndex * (sLength + 1)) = lvIndex
Next
For lvRowIndex As Integer = 0 To sLength - 1
Dim s_i As Char = s(lvRowIndex)
For lvColIndex As Integer = 0 To tLength - 1
If s_i = t(lvColIndex) Then
lvCost = 0
zeroCostCount += 1
Else
lvCost = 1
End If
' Step 6
Dim lvTopLeftIndex As Integer = lvColIndex * (sLength + 1) + lvRowIndex
Dim lvTopLeft As Integer = poBuffer(lvTopLeftIndex)
Dim lvTop As Integer = poBuffer(lvTopLeftIndex + 1)
Dim lvLeft As Integer = poBuffer(lvTopLeftIndex + (sLength + 1))
lvDistance = Math.Min(lvTopLeft + lvCost, Math.Min(lvLeft, lvTop) + 1)
poBuffer(lvTopLeftIndex + sLength + 2) = lvDistance
Next
Next
Catch ex As ThreadAbortException
Err.Clear()
Catch ex As Exception
WriteDebugMessage(Application.StartupPath , [Assembly].GetExecutingAssembly().GetName.Name.ToString, MethodBase.GetCurrentMethod.Name, Err)
End Try
Return lvDistance - zeroCostCount
End Function
Существуют многие поставщики там что продукты предложения, чтобы сделать этот вид сопоставления с образцом. Я провел бы некоторое исследование и нашел бы хороший, хорошо сочтенный продукт и фрагментировал бы систему собственной разработки.
Как Вы говорите, Ваш продукт только хорош, и это - достаточно общая потребность в компаниях, что я уверен, что там существует больше чем один превосходный продукт. Даже если это будет стоить нескольких тысяч маркеров за лицензию, то все еще будет более дешево, чем оплата набора разработчиков работать над чем-то внутренним.
Кроме того, то, что "сложные" фразы, "интенсивный ЦП", "код VBA" и "база данных Access" появляются вместе в описании Вашей системы, является другой причиной найти хорошую стороннюю программу.
Править: также возможно, что.NET имеет встроенный компонент, который делает такого рода вещь, в этом случае Вы не должны были бы платить за него. Я все еще удивлен время от времени инструментами, что.NET предлагает.
SSIS (в Sql 2005 + Предприятие) имеет Нечеткий Поиск, который разработан для просто таких проблем чистки данных.
Кроме этого, я только знаю о зависящих от домена решениях - таких как очистка адреса или общие методы сопоставления строк.
Доступ действительно не имеет инструментов для этого. В идеальном мире я пошел бы с решением SSIS и использовал бы нечеткий поиск. Но если Вы в настоящее время используете Доступ, возможности Вашего офиса, покупая Версию для предприятий SQL Server кажутся низкими мне. Если Вы застреваете с текущей средой, Вы могли бы попробовать метод решения "в лоб".
Запустите со стандартизированной чистки адресов. Выберите стандартные сокращения для улицы, raod, и т.д. и напишите код для изменения всех нормальных изменений на тех стандартный addesses. Замените любые экземпляры двух пробелов с одним пространством, обрежьте все данные и удалите любые неалфавитно-цифровые символы. Поскольку Вы видите, что это - настоящая задача.
Что касается названий компаний, возможно, можно попытаться соответствовать на первых 5 символах имени и адреса или телефона. Вы могли также составить таблицу известных изменений и чего они коснутся в Вашей базе данных для использования для cleanising будущих файлов. Таким образом, если Вы записываете с идентификатором 100, Acme, Inc., у Вас могла бы быть таблица как это:
Имя idfield
100 Acme, Inc.
100 Acme, Inc
100 высших точек, объединенных
100 высших точек, LLC
100 Высших точек
Это начнет с малого, но создавать со временем при создании записи каждым разом, когда Вы находите и чините дубликат (сделайте это частью Вас процесс дедупликации), и если Вы делаете запись каждым разом, когда Вы можете соответствовать первой части имени и адреса к существующей компании.
Я также посмотрел бы на тот функциональный отправленный Torial и видел бы, помогает ли он.
Все это было бы болезненным и трудоемким, но будет поправляться со временем, поскольку Вы находите новые изменения и добавляете их к коду или списку. Если Вы действительно решаете к stardardize свой addressdata, удостоверьтесь, что убрали производственные данные сначала, то сделайте любой импорт в рабочую таблицу и уберите их, то попытайтесь соответствовать к производственным данным и вставить новые записи.
Я имею дело с точно той же проблемой. Смотрите на:
Инструменты для соответствия имени/адресным сведениям
для некоторых инструментов, которые могли бы помочь.