0

Generate T-SQL Via T4 (TPH).xaml (VS) および SSDLToSQL10.tt (VS) テンプレートでエンティティ フレームワークを使用します。私はテーブルを持っています

TABLE [dbo].[Users](
    [UserId] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](100) NOT NULL,
    [Password] [nvarchar](50) NOT NULL,
    [IsPaid] [bit] NOT NULL

2 つのユーザー タイプがあるため、フィールド IsPaid が識別子です。モデルに TPH を作成しました。.tt 経由で生成されたクラスは

public abstract partial class User
    {
        public User()
        {
        }

        public int UserId { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

public partial class RegularUser : User
{
}

public partial class PaidUser : User
{
}

    public Container()
        : base("name=Container")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<User> Users { get; set; }

ID 3 の正規ユーザーがいるとします。同じデータで新しい有料ユーザー u を作成し、保存しようとします。

using (var entities = new Container())
            {
                entities.Entry(u).State = u.UserId == 0 ? EntityState.Added : EntityState.Modified;
                entities.SaveChanges();
            }

何も起こりません。また、プロファイラーから、クエリが IsPaid 列をまったく使用していないことがわかります。誰でも助けることができますか?

4

1 に答える 1

1

Id=3 の一般ユーザーを Id=3 の有料ユーザーに変更しようとしていますか? これは、直接 SQL 更新を実行しないと不可能です。EF の観点から、エンティティ タイプは永続的です。オブジェクトを操作する場合と同じです。メモリ割り当てが異なる (= ID が異なる) まったく新しいインスタンスを作成せずに、通常のユーザーを有料ユーザーに「変換」することはできません。

通常のユーザーが有料ユーザーになることをビジネス ロジックが想定している場合、EF 継承はそれができないため、解決策ではありません。通常のユーザーを有料ユーザーに「変更」する唯一の方法は、有料ユーザーの新しいインスタンス全体を作成し、それをデータベースに挿入して、通常のユーザーの古いインスタンスを削除することです (ユーザーから他のエンティティへのすべての関係も修正する必要があります)。

于 2013-01-22T13:09:55.777 に答える