intとstringの間の一意のインデックス -- c# フィールド と sql-server フィールド と entity-framework フィールド 関連 問題

Unique index between int and string












1
vote

問題

日本語

整数と文字列の間に一意のインデックスを作成したいと思うこの問題を持っていますが、次の問題を教えてください。この作品を作るにはどうすれば、なぜこれは許可されていませんか?データベースにダブルラベルが保存されていないことを確認するために、実際に本当にこの独自の組み合わせが必要なので。

列 'label' in table 'dbo.hostingreportGroups'は、インデックスのキー列として使用するのに無効な型です。

これに使用するモデルは次のとおりです。

<事前> <コード> public class HostingReportGroup { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Index("UniqueCustomerAndLabel", 1, IsUnique = true)] public int CustomerId { get; set; } [Index("UniqueCustomerAndLabel", 2, IsUnique = true)] public string Label { get; set; } public virtual ICollection<HostingReportGroupList> HostingReportGroupLists { get; set; } }

と実行しようとしているマイグレーションには、次のコードが含まれています。

<事前> <コード> public partial class adding_unique_key_to_hosting_report_group : DbMigration { public override void Up() { CreateIndex("dbo.HostingReportGroups", new[] { "CustomerId", "Label" }, unique: true, name: "UniqueCustomerAndLabel"); } public override void Down() { DropIndex("dbo.HostingReportGroups", "UniqueCustomerAndLabel"); } }
英語

I've got this issue where I want to create a unique index between an integer and a string, but it's giving me the following issue. How can I make this work and why is this not allowed? Because I actually really want this unique combination, to make sure no double labels are stored in the database.

Column 'Label' in table 'dbo.HostingReportGroups' is of a type that is invalid for use as a key column in an index.

The model that I use for this is the following:

public class HostingReportGroup {     [Key]     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]     public int Id { get; set; }      [Index("UniqueCustomerAndLabel", 1, IsUnique = true)]     public int CustomerId { get; set; }      [Index("UniqueCustomerAndLabel", 2, IsUnique = true)]     public string Label { get; set; }      public virtual ICollection<HostingReportGroupList> HostingReportGroupLists { get; set; } } 

And the migration that I'm trying to execute contains the following code:

public partial class adding_unique_key_to_hosting_report_group : DbMigration {     public override void Up()     {         CreateIndex("dbo.HostingReportGroups", new[] { "CustomerId", "Label" }, unique: true, name: "UniqueCustomerAndLabel");     }      public override void Down()     {         DropIndex("dbo.HostingReportGroups", "UniqueCustomerAndLabel");     } } 
</div
        
     
     

回答リスト

6
 
vote
vote
ベストアンサー
 

c#文字列データ型は、T-SQLの NVARCHAR(MAX) として変換されます。 SQL Serverには制限があります。

索引を作成する

結合インデックス値の最大許容サイズは、クラスタインデックスの場合は900バイト、すなわち非クラスタ化インデックスの場合は1,700です。

大きいオブジェクト(LOB)データ型NTEXT、TEXT、 VARCHAR(MAX)、NVARCHAR(MAX)、varbinary(max)、XML、またはイメージをキーとして指定できないindex

の列

だから最大サイズを定義する必要があります(注釈を使用):

<事前> <コード> [MaxLength(500)]

dbfiddle demo

 

C# string data type is translated as NVARCHAR(MAX) in T-SQL. SQL Server has limitation:

CREATE INDEX

The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index.

Columns that are of the large object (LOB) data types ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image cannot be specified as key columns for an index

So you need to define max size(using annotation):

[MaxLength(500)] 

DBFiddle Demo

</div
 
 

関連する質問

1  LINQを持つ関数で戻り値を定義する方法  ( How to define the return type in a function with linq ) 
関数内のreturnTypeを定義する方法を知りたいのですが 次の状況。 私は製品を持っていて、私はすべての情報や1つの製品を一度に返していました。 あなたが以下に定義されている私の関数で見ることができるように。 <事前> <コード> public stati...

1  DataGridからEFへの行を添付する最善の方法  ( Best way to attach row from datagrid to ef ) 
MVVMとEFを使用して...ビューモデルへのDataGridバインディング(ObservableCollectionを使用)。ビューモデルには、データコンテキストのsaveChangesコマンドを単純に呼び出すシェアコマンドがあります。ただし、ユーザーがD...

3  ASP.NET動的データを使用する方法別のDLLでエンティティフレームワーク  ( How to use asp net dynamic data with entity framework in another dll ) 
別のDLLのEFを使用してASP.NETダイナミックデータを使用する方法、web.configまたはconfigファイルに接続文字列を置きたくありません。 このコードはGlobal.asax にあります model.registerContext(()=&g...

3  データベース/フレームワークなしのASP.NET MVCモデル  ( Asp net mvc models without databases framework ) 
データベースによって管理されていないモデルが管理されていない(Linq2SQLまたはEntity Frameworkを介して)というチュートリアル/例はあります。 JSONベースのAPIを持つサーバーのフロントエンドを作成する必要があります。 MVC 3または...

11  エンティティフレームワークはSQL Express(MDF)でデータを保持しません  ( Entity framework wont persist data in sql express mdf ) 
I Entity Frameworkを使用してアプリケーションを開発し、.MDFデータベースにデータを格納していました。私のコードはデータを読むことができます、明らかにそれはそれを保存することができますが、どうやら。それはエレソなしで、プログラムがデータを保...

0  WCF RIAサービス/ LINQ2SQLDOMAINMODELでの荷重を熱望する方法  ( How to eager load in wcf ria services linq2sqldomainmodel ) 
私は私のビュー(xaml)にデータバインドグリッドを持っており、ItemoundはReportScollectionを指しています。レポートエンティティには3つのプリミティブといくつかの複雑なタイプがあります。これら3つはDataGridで期待通りに示されてい...

14  エンティティフレームワーク - データベースからの更新モデル... - 更新は起こりません。  ( Entity framework update model from database no update happens ) 
CompanyDetails と呼ばれるDBにテーブルがあります。 CharacterID varchar(255) という列があります。 NOT NULL 欄に NOT NULL 列から変更しました。モデルブラウザの「データベースからの更新モデル」...

2  エンティティコメントは、更新されたモデルの保存時に削除されます  ( Entity comments are removed upon saving of updated model ) 
クリアする:エンティティがEF実装にしっかりとバインドされていないようにPOCOジェネレータを使用します。 私のエンティティでは、プロパティにコメントを追加する傾向がありますが、モデルを更新して保存すると、すべてのコメントが削除されます。 この動作を防ぐに...

1  RIAサービス - 2つのエンティティモデルがエンティティ名を共有する  ( Ria services two entity models share an entity name ) 
2つのエンティティモデルが2つの異なるデータベースに接続されていました。ただし、2つのデータベースの両方とも、たとえば 'Brand'という名前のテーブルがあります。そのため、私のモデルには命名競合があります。さて、モデルのプロパティのカスタムツールの名前空...

16  団体へのLINQを含むLINQを学ぶためにそこに最もよい本がそこにあるか? [閉まっている]  ( Which is the best book out there to learn linq including linq to entities ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有