0

オブジェクトのプロパティとして使用したい次のクラスがありLoginます。可能であれば、このクラスにはナビゲーション プロパティを持たないことをお勧めします (簡単なチェックに使用されるため) が、以下に示すものは許可します。

public class LoginFeature
{
    [Key, Column(Order = 0)]
    public int RoleId { get; set; } //Role is another table in the db, but not looking for a nav. property or constraint here.

    [Key, Column(Order = 1)]
    public virtual Login Login { get; set; }

    public bool Deny { get; set; }
}

これらのコレクションを含むクラスは (スペースのために取り除かれています)

public class Login
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } //Database ID

    public virtual List<LoginFeature> LoginFeatures { get; set; }
}

私のDbContextは次のように定義されています

public class MyContext : DbContext
{
    public DbSet<Login> Logins { get; set; }
    public DbSet<LoginFeature> LoginFeatures { get; set; }
}

しかし、次のテストでは、次のエラーが生成されます。

System.Data.Entity.Infrastructure.DbUpdateException : リレーションシップの外部キー プロパティを公開しないエンティティの保存中にエラーが発生しました。1 つのエンティティを例外のソースとして識別できないため、EntityEntries プロパティは null を返します。保存中の例外の処理は、エンティティ タイプで外部キー プロパティを公開することで簡単に行うことができます。詳細については、InnerException を参照してください。----> System.Data.UpdateException : エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。----> System.Data.SqlClient.SqlException : 値 NULL を列 'RoleId'、テーブル 'TEST.dbo.LoginFeatures' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

    [Test]
    public void LoginCanHaveFeatures()
    {
        using (var ctx = new MyContext())
        {
            var login = ctx.Logins.FirstOrDefault(x => x.Id == 30);
            Assert.IsNotNull(login);

            for (int i = 10; i < 15; i++)
            {
                var feature = new LoginFeature();
                feature.Login = login;
                feature.RoleId = i;
                feature.Deny = true;
                login.LoginFeatures.Add(feature);
            }

            ctx.SaveChanges();
        }
    }

EFProf で示されているように生成される SQL は次のとおりです。

insert [dbo].[LoginFeatures]
   ([Deny],
    [Login_Id])
values (1 /* @0 */,
    30 /* @1 */)

LoginFeatureこれは、データ注釈属性が正しくないことを暗示しているようです。私がやろうとしていることは可能ですか?

ありがとう、

ジョー

4

1 に答える 1

1

ナビゲーション プロパティをキーとして定義することはできません。プリミティブ プロパティのみがキーとしてサポートされます。したがって、次のようにクラスを定義する必要があります。

public class LoginFeature
{
    [Key, Column(Order = 0)]
    public int RoleId { get; set; }

    [Key, Column(Order = 1)]
    public int LoginId { get; set; }

    public virtual Login Login { get; set; }

    public bool Deny { get; set; }
}

マッピング規則はLoginIdの外部キーとして検出されますLogin。エラーが発生するのは、EF が 2 番目のキー属性を無視し (ナビゲーション プロパティにあったため)、最初のキーのみを使用しRoleId、既定で (単一のキーの場合) キーがデータベースで自動生成されると想定している (明らかにそうではない) ためです。 t) その値をデータベースに送信しません。

于 2013-09-23T20:28:55.527 に答える