-1

現場にソフトウェアがあり、それに新しいテーブルを追加する必要があります。エンティティ フレームワークにテーブルがあり、新しいクライアントがテーブルを取得します。他の人を更新するにはどうすればよいですか?

追加: 明確にするために、私の開発と新しいクライアントにはテーブルがあります。問題は、古いクライアント データベースを更新する方法です。

それは私のモデルにあるので、create メソッドを呼び出すだけで、すべてが内部で発生するはずです。

_context.NewTable.CreateTable();

ただし、テーブルが存在するかどうか、およびテーブルを作成しないかどうかを確認するには、SQL コマンド文字列を作成する必要があると考えてください。

IDVisitorEntities _context = new IDVisitorEntities ();

String cmd = IF NOT EXISTS ( SELECT [name] 
FROM sys.tables
WHERE [name] = NewTable )
CREATE TABLE NewTable (
ID int IDENITY,
NAME    VARCHAR(40))

_context.NewTable.CommandText (cmd);

テーブルが存在しない場合は、これを 1 回だけ実行します。それではその問題は解決しません。どうすればいいのか本当にわかりません。

2013 年 5 月 6 日に追加 EF には各テーブルのプロパティ コレクションがあり、それが手がかりになるのではないかと考えています。ICustomTypeDescriptor を使用する必要があるかもしれません ... 他に考えがある人はいますか?

2013 年 7 月 15 日に追加されまし た。新しい仕事で作成を開始しました。ここにサンプルがあります。部分クラスを含むファイルを作成し、それらに抽象とインターフェイスを適用する必要があります。先は長いですが、これが始まりです...

namespace DataModelMAXFM
{
public abstract class ATable
    {
    private ArrayList _columns = new ArrayList();
    private ArrayList colsToAdd = new ArrayList(); 


    public ArrayList Columns
        {
        get
            {
            return _columns;
            }
        }

    public bool TableCreate(SqlConnection sqlConn)
        {
        //assuming table needs to be created (already checked) 
        //get column list
        //use for loop to create query string
        // run command 
        ITable thisItable;
        if (Columns.Count <= 0) //generate column list if not already created
            {
            if (!ColumnList())
                return false;
            }

        if (this is ITable)
            {
            thisItable = (ITable) this;
            }
        else
            {
            throw new Exception("");
            }

        StringBuilder sb = new StringBuilder("CREATE TABLE " + thisItable.GetTableName() + " (");
        bool flgFirst = true;  // to allow for proper comma placement 
        foreach (PropertyInfo prop in Columns)
            {
            String propType = this.GetDataType(prop);
            if (propType == String.Empty)//check to make sure datatype found a match, EF to SQL
                {
                return false;
                }

            if (!flgFirst)
                {
                sb.Append(", ");
                }
            else
                {
                flgFirst = false;
                }

            sb.Append(prop.Name + " " + propType);
            }
        // add right parentheses
        sb.Append(")");

        //now run query created above
        SqlCommand com;
        try
            {
            com = new SqlCommand(sb.ToString(), sqlConn);
            com.ExecuteNonQuery();
            }
        catch (Exception e)
            {
            Console.WriteLine("TableCreate  e:" + e.ToString());
            return false;
            }

        return true;
        }



    public bool TableExists(SqlConnection sqlConn)
        {
        SqlDataReader sdr = null;
        SqlCommand com;
        ITable thisItable;
        try
            {
            //create and execute command
            if (this is ITable)
                thisItable = (ITable)this;
            else
                {
                throw new Exception("");
                }
            com = new SqlCommand("Select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = " + thisItable.GetTableName(), sqlConn);
            sdr = com.ExecuteReader();
            if (!sdr.HasRows)//ie table does not exist
                {
                return false;
                }
            }
        catch (Exception e)
            {
            Console.WriteLine("TableCreate  e:" + e.ToString());
            return false;
            }

        //close datareader
        try
            {
            sdr.Close();
            }
        catch (Exception e)
            {
            Console.WriteLine("close sqldatareader TableExists  e: " + e.ToString());
            }
        return true;
        }

    public bool ColumnList()
        {

        bool flgListCreated = false;
        PropertyInfo[] propList = typeof(TransactionCategory).GetProperties();
        foreach (PropertyInfo prop in propList)
            {

            if (prop.CanRead && prop.CanWrite)
                {
                MethodInfo mget = prop.GetGetMethod(false);
                MethodInfo mset = prop.GetSetMethod(false);

                // Get and set methods have to be public
                if (mget == null)
                    {
                    continue;
                    }
                if (mset == null)
                    {
                    continue;
                    }
                Columns.Add(prop);

                if (!flgListCreated)
                    {
                    flgListCreated = true;
                    }
                }
            }
        return flgListCreated;
        }


    public bool ColumnsExist(SqlConnection sqlConn)
        {

        ITable thisItable;
        if (Columns.Count <= 0)
            {
            if (!ColumnList()) 
                return false; 
            }

        //2013-07-10 create basic connection and data reader 
        if (this is ITable)
            thisItable = (ITable)this;
        else
            {
            throw new Exception("");
            }
        SqlDataReader sdr = null;
        SqlCommand com;
        foreach (PropertyInfo prop in Columns)
            {
            try
                {
                //create and execute command
                com = new SqlCommand("Select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = " + thisItable.GetTableName() + " and COLUMN_NAME = " + prop.Name, sqlConn);
                sdr = com.ExecuteReader();

                //if no rows returned to datareader == column does not exist, add to ArrayList of columns to add
                if (!sdr.HasRows)
                    colsToAdd.Add(prop);
                }
            catch (Exception e)
                {
                Console.WriteLine(e.ToString());
                return false;
                }


            }
        //close datareader
        try
            {
            sdr.Close();
            }
        catch (Exception e)
            {
            Console.WriteLine("close sqldatareader ColumnsExist  e: " + e.ToString());
            }

        if (colsToAdd.Count == 0)
            return false;

        //returns true only if method worked and found columns to add to DB
        return true;
        }

    public bool ColumnsCreate(SqlConnection sqlConn)
        {
        ITable thisItable;
        StringBuilder sb = new StringBuilder();
        if (colsToAdd.Count <= 0)
            {
            if (!ColumnsExist(sqlConn)) //2013-07-08 - MAXIMUS\58398(BJH) //if no columns, attempt to create list
                return false; // if Column list was not created, return false
            }
        // add a array of the alter table
        if (this is ITable)
            thisItable = (ITable)this;
        else
            {
            throw new Exception();
            }

        sb.Append("ALTER TABLE " + thisItable.GetTableName() + " ADD ( ");
        bool flgFirst = true; // allows for no leading comma on first entry
        String propType;
        foreach (PropertyInfo prop in colsToAdd)
            {

            //make sure SQL datatype can be determined from EF data
            propType = this.GetDataType(prop);
            if (propType == String.Empty)
                throw new Exception("no datatype match found " + prop.Name + " " + prop.PropertyType.ToString()); 
            if (!flgFirst)
                {
                sb.Append(", ");
                }
            else
                {
                flgFirst = false;
                }
            sb.Append(prop.Name + " " + propType);
            }
        sb.Append(" )");

        SqlCommand com;
        try
            {
            com = new SqlCommand(sb.ToString(), sqlConn);
            com.ExecuteNonQuery();
            }
        catch (Exception e)
            {
            Console.WriteLine(e.ToString());
            return false;
            }
        return true;
        }
    public bool ColumnsUpdate(SqlConnection sqlConn)
        {
        if (ColumnsExist(sqlConn))
            return ColumnsCreate(sqlConn);
        else
            return false;
        }

    //method to convert from EF to SQL datatypes, see noted issues
    public String GetDataType(PropertyInfo pi)
        {
        String s = "";
        String pistr = pi.PropertyType.ToString();
        switch (pistr)
            {
            case "Byte[]":
                s = "binary";
                break;
            case "Boolean":
                s = "bit";
                break;
            case "String Char[]": // also maps to other options such as nchar, ntext, nvarchar, text, varchar
                s = "char";
                break;
            case "DateTime":
                s = "datetime";
                break;
            case "DateTimeOffset":
                s = "datetimeoffset";
                break;
            case "Decimal":
                s = "decimal";
                break;
            case "Double":
                s = "float";
                break;
            case "Int16":
                s = "smallint";
                break;
            case "Int32":
                s = "int";
                break;
            case "Int64":
                s = "bigint";
                break;
            case "Single":
                s = "real";
                break;
            case "TimeSpan":
                s = "time";
                break;
            case "Byte":
                s = "tinyint";
                break;
            case "Guid":
                s = "uniqueidentifier";
                break;
            case "Xml":
                s = "xml";
                break;
            default:
                Console.WriteLine("No datatype match found for " + pi.ToString() + " " + pi.PropertyType.ToString());
                return String.Empty;
            }
        return s;
        }


    }

public interface ITable
    {

    int ID
        {
        get;
        }

    bool TableUpdate(SqlConnection sqlConn);
    bool TableStoredProceduresCreate(SqlConnection sqlConn);
    bool TableStoredProceduresDrop(SqlConnection sqlConn);
    bool TableCreateTriggers(SqlConnection sqlConn);
    bool TableCreateViews(SqlConnection sqlConn);
    DataTable GetDataTable();
    DateTime dtTableImplemented
        {
        get;
        }

    String GetTableName();




    }


}
4

1 に答える 1

0

他の人を更新するにはどうすればよいですか?

そして、そのテーブルを必要とするように他のコードをどのようにアップグレードしますか? おそらくパッチまたはアップグレードパッケージを使用すると、このパッケージもテーブルを作成するはずです。

それは私のモデルにあるので、create メソッドを呼び出すだけで、すべてが内部で発生するはずです。

いいえ。EF 自体には、データベース スキーマを定義するものは何もありません (データベース全体を作成するための SQL スクリプトの作成を除く)。あなたが探しているものはEF Migrationsで可能ですが、それは最初にコードとDbContext APIを使用する場合のEF 4.3以降の機能です。

于 2012-08-22T08:06:44.770 に答える