0

Entity Framework を使用しており、MySQL データベースに接続しています。id 列は StoreGeneratedPattern Identity を使用するように設定され、データベースの列は自動インクリメントに設定されています。新しいオブジェクトを作成してデータベースに保存すると、アイテムがデータベースに正しく投稿されます。ただし、保存後、C# のオブジェクトの ID は、データベースによって割り当てられた値を反映するのではなく、0 のままです。

コードのセクションを以下に示します。

Group newGroup = new Group("MyGroupName", "Active");
dbContext.Groups.Add(newGroup);
dbContext.SaveChanges();
int testId = newGroup.id;

「newGroup」はデータベースに割り当てられたIDでデータベースに保存されますが、IDを読み取ると(testIdを読み取るときなど)、IDはまだ0です。

thisに基づいて、追加してみました

dbContext.Entry(newGroup).Reload();

SaveChanges() の後、私も( thisおよびthisに基づいて)追加を試みました

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, newGroup);

データベースからオブジェクト(したがってID)を更新しようとしてSaveChanges()の後、問題は残ります。データベースによって割り当てられた ID を取得するにはどうすればよいですか?

編集:グループのクラス定義を追加:

[Table("groups")]    
public partial class Group
{
    public Group()
    {
        this.user_groups = new HashSet<UserGroup>();
    }

    public long id { get; set; }
    public string name { get; set; }
    public string status { get; set; }
    public System.DateTime created_at { get; set; }
    public System.DateTime updated_at { get; set; }

    public virtual ICollection<UserGroup> user_groups { get; set; }
}
4

3 に答える 3

0

私は自分のプロジェクトで同じ問題を抱えています。回避策として、ID の降順でテーブル (グループ) を並べ替え、最初のレコードまたは既定のレコードを選択してから、ID 列を選択しました。

var newID = dbcontext.Groups.OrderByDescending(x => x.id).FirstOrDefault().ID

その後、それを必要なものに割り当てて、変更を再度保存できます。古いスレッドであることは知っていますが、これが役立つことを願っています。もっと良い方法があるはずです...

于 2014-01-14T00:05:55.027 に答える
0

この属性であるべきです

[DatabaseGenerated(DatabaseGenerationOption.Identity)]

ただし、これをデフォルトにする必要があります。

列名は魔法なので、[Key]属性は不要なはずIdです...これは、C# で受け入れられている命名規則を使用する場合にのみ当てはまる場合があります。

longあなたのidプロパティが型付けされているのか、それとも命名規則なのだろうか...名前を付けてみてくださいId

于 2013-10-01T12:40:01.953 に答える
0

[Key] 属性で ID を装飾してみてください。

于 2013-10-01T11:26:23.640 に答える