2017-02-27 6 views
2

エンティティフレームワークの選択肢が間違っているかどうかわかりませんが、DbSetにAddRangeエンティティを追加しようとすると表示されません自動的に生成されたIDENTITYフィールドを取得します。Entity FrameworkでAddRangeを使用してIDENTITYを自動生成できない

[Table("entities")] 
public class Entity 
{ 
    [Key] 
    [Column("id")] 
    public long Id { get; set; } 

    [Column("field")] 
    public string Field { get; set; } 
} 

var entities = new Entity[] 
{ 
    new Entity() { Field = "A" }, 
    new Entity() { Field = "B" }, 
}; 

_dbContext.Entities.AddRange(entities); 
await _dbContext.SaveChangesAsync(); 

//ids are still default(long) at this point!! 

EDIT:enumerables: ここでは、問題を引き起こしていたかを示すために更新されたコードです。エンティティクラスに他の属性を追加する必要はありません。

public class Request 
{ 
    public string Field { get; set; } 

    public Entity ToEntity() 
    { 
     return new Entity() { Field = Field }; 
    } 
} 

public async Task<IEnumerable<long>> SaveRequests(IEnumerable<Request> requests) 
{ 
    var entities = requests.Select(r => r.ToEntity()); //not working 
    var entities = requests.Select(r => r.ToEntity()).ToArray(); //working 

    _dbContext.Entities.AddRange(entities); 
    await _dbContext.SaveChangesAsync(); 

    return entities.Select(e => e.Id); 
} 
+0

[キー] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] –

+0

私は同じ問題をHAE、 VAR ADATA = referencias.Select(I => 新しいInternalClass() {/ * IdがAUTOGEN、*/... }); db.InternalClass.AddRange(aData); db.SaveChanges(); しかし、aData.FirstOrDefault()(id = 0)の新しいIDを取得することはできません なぜそれが起こるかについての詳細情報を見つけましたか? –

答えて

0

何が原因でしたか? Enumerables!ソリューションについて私の質問でEDITセクションを見てください。

0

これを試してください、これはInt型の列で動作します。長い型を試す必要があります。

[Table("entities")] 
public class Entity 
{ 
    [Key] 
    [Column("id")] 
    // this you need to tell to Ef to use Identity . 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("field")] 
    public string Field { get; set; } 
} 
0

私はEF 6でDatabase Firstを使用しており、しばらくの間試してみると、可能な解決策が見つかりました。

まず、あなたがあなたのテーブルを作成するときに

ID int IDENTITY(1,1) PRIMARY KEY, 

のようなものを使用して宣言することができ、自動インクリメントの主キーフィールドとして「ID」列に、定義されていることを確認し、データベース内のテーブルをチェック。関連情報にはhere1またはhere2があります。

またはあなたのようなMSSQL IDEでのデータのプロパティを確認することができます。「ID」列のStoreGeneratedPatternとしてのアイデンティティを設定し、

an img I find in the internet

第二に、あなたはオープンEDMXファイルでそれを行うことができますVisual Studioで、テーブルのデータ列を右クリックして[プロパティ]を選択し、[プロパティ]ウィンドウにStoreGeneratedPatternの設定を入力します。

enter image description here

いくつかの関連記事hereを参照してください。

EF AddRangeを使用して上記の作業が完了すると、IDは自動インクリメントされ、すべて正常に動作します。

public class Entity 
{ 
    public long Id { get; set; } 
    public string Field { get; set; } 
} 

var entities = new Entity[] 
{ 
    new Entity() { Field = "A" }, 
    new Entity() { Field = "B" }, 
}; 

_dbContext.Entities.AddRange(entities); 
関連する問題