2

コードファーストの方法でこれを行う方法を理解しようとしています。SQL ステートメントと ASP を使用してより多くのコードを作成していた頃に、その方法を理解しています。今、私はC#でコードファーストのMVCメソッドを使ってそれを理解する方法を自分自身に教えようとしています.

まず、SQLで何が欲しいかを説明するとしたら、このようなものを再現しようとしています。

    Select s1.systemname, s2.systemname, j,jumplaneid 
    from systems s1, systems s2, jumplanes j 
    where s1.systemid = j.system1id and s2.systemid = j.system2id

これが私がシステム用に持っているモデルです。

    public class system
    {
    public virtual int systemid { get; set; }
    public virtual string systemname { get; set; }
    public virtual int? posx { get; set; }
    public virtual int? posy { get; set; }
    public virtual int? starluminosityid { get; set; }
    public virtual int? stellartypeid { get; set; }
    public virtual int? starspectralclassid { get; set; }
    public virtual int? carry { get; set; }
    public virtual int? raw { get; set; }
    public virtual int? bio { get; set; }
    public virtual int? jumppoints { get; set; }
    public virtual int? specialrolls { get; set; }

    public virtual ICollection<settlement> settlements { get; set; }
    public virtual ICollection<fleet> fleets { get; set; }
    public virtual ICollection<Jumplane> jumplanes { get; set; }
    public virtual stellartype Stellartype { get; set; }
    public virtual starluminosity Luminosity { get; set; }
    public virtual starspectralclass SpectralClass { get; set; }
}

エンドポイントのシステム モデルを参照するジャンププレーン モデルを作成しようとしています。私はそれをこのように設定しました。これは近いと思いますが、完全ではありません。考え?

public class Jumplane
{
    public virtual int jumplaneid { get; set; }
    public virtual int jumpcost { get; set; }
    public virtual string jumplanename { get; set; }
    public virtual system system1 { get; set; }
    public virtual system system2 { get; set; }
    public virtual ICollection<Supplyline> supplylines { get; set; }
}

「update-database」を実行してすべてをデータベースにセットアップすると、次のようなトレースが表示されます。

    PM> update-database -force
    Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
    No pending code-based migrations.
    Applying automatic migration: 201302030335260_AutomaticMigration.
    System.Data.SqlClient.SqlException (0x80131904): Either the parameter @objname is     ambiguous or the claimed @objtype (COLUMN) is wrong.
      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
      at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
      at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
      at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
      at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout)
      at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
      at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
      at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
      at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
      at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
      at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
      at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto)
      at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)
      at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading)
      at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
      at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
      at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
      at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
      at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
      at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
    ClientConnectionId:c4c1ba62-806b-4e68-bb0b-161da4d9e23e
    Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.

データベースを最初にセットアップすれば、その方法は理解できますが、コード ファーストの方法を習得しようとしています。ソフトウェア開発の現在の傾向に精通している人はいますか?

ありがとう!

更新: お二人に感謝します。それぞれから何かを学びました。

これが私がたどり着いた場所です。

    public class Jumplane
{
    [Key]
    public int jumplaneid { get; set; }      
    [Range (1,1000)]
    public decimal jumpcost { get; set; }
    [Required]
    [StringLength(30)]
    public string jumplanename { get; set; }
    public virtual Starsystem starsystem1 { get; set; }
    public virtual Starsystem starsystem2 { get; set; }
    public virtual ICollection<Supplyline> supplylines { get; set; }
}

public class Starsystem
{
    [Key]
    public int starsystemid { get; set; }
    public string systemname { get; set; }
    public int? posx { get; set; }
    public int? posy { get; set; }
    public int? starluminosityid { get; set; }
    public int? stellartypeid { get; set; }
    public int? starspectralclassid { get; set; }
    public int? carry { get; set; }
    public int? raw { get; set; }
    public int? bio { get; set; }
    public int? jumppoints { get; set; }
    public int? specialrolls { get; set; }

    public virtual ICollection<settlement> settlements { get; set; }
    public virtual ICollection<fleet> fleets { get; set; }
    public virtual ICollection<Jumplane> jumplanes { get; set; }
    public virtual stellartype Stellartype { get; set; }
    public virtual starluminosity Luminosity { get; set; }
    public virtual starspectralclass SpectralClass { get; set; }
}

戻って、追加の注釈をキャッチします。頭がとがった髪の毛で覆われてしまったので、注釈の意味を見逃していました。

私が Update-Database で抱えていた問題は、名前の変更の問題であるとあなたが示唆したときに明らかになりました。-Verbose オプションを追加すると、それが非常に明確になりました。おそらくだまされたのでしょうが、モデル内の両方のスターシステム参照を削除してモデルを単純化し、データベースを更新してから、それらを 1 つずつ追加し直しました。

また、クラスの大文字化と「virtual」キーワードの使用に関するコード レビューにも感謝します。id と name にわかりやすい接頭辞を残しましたが、これを省略すると後で混乱する可能性があるため、これは主に私のためです。コードは私だけのものなので、その特定のアドバイスを伝えることにしましたが、フィードバックは大歓迎でした (今もそうです)。

お時間と専門知識をお寄せいただき、重ねてお礼申し上げます。

4

2 に答える 2

0

このエラーは通常、テーブルの名前を変更しようとしたときに発生します。

モデルを作成し、可能な限り最小限のフィールドで目的の結果を達成することをお勧めします。virtualまた、外部エンティティでのみキーワードを使用したいと考えています。

同様のもの(Admin、AdminLog [Admin1とAdmin2を含む])をテストしたところ、問題なく機能しました。

試すべきコード

public class System
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Jumplane
{
    public int ID { get; set; }
    public virtual System System1 { get; set; }
    public virtual System System2 { get; set; }
}

このコードが機能し、目的の LINQ クエリを実行できるようになったので、他のすべてのフィールドをそれに追加するだけです。

いくつかの指針(おそらく主観的)

  • 外国人限定のバーチャル
  • クラスは大文字で始まります
  • SystemIDSystemNameフィールドは必要ありませIDNameSystem
于 2013-02-03T18:11:51.993 に答える
0

EF で必要なクエリは、次のようになります。dbContext.Jumplanes.Include("system1").Include("system2")

そうは言っても、モデルには属性/注釈がなく、すべてが仮想です。プロパティを遅延ロードする場合にのみ、プロパティを仮想に設定する必要があります。要素の主キーは、遅延ロードするべきではありません。

Key属性と属性を見てForeignKey、モデルに注釈を付け、不要な仮想キーワードを削除してから、それがどうなったかをお知らせください:)

于 2013-02-03T18:01:50.360 に答える