オブジェクトのプロパティとして使用したい次のクラスがあり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
これは、データ注釈属性が正しくないことを暗示しているようです。私がやろうとしていることは可能ですか?
ありがとう、
ジョー