0

遅延読み込みは、db-first と同じように code-first では機能しないようです。

検討:

public class Project
{
    [Key]
    public long ProjectId { get; set; }

    [Required]
    [MaxLength(60)]
    public virtual string Name { get; set; }
}

と:

public class TestCase
{
    [Key]
    public long TestCaseId { get; set; }

    [Required]
    [ForeignKey("ProjectId")]
    public virtual Project Project { get; set; }
    public virtual long ProjectId { get; set; }
}

この DbContext では:

public class TestDbContext : DbContext
{
    public TestDbContext() : base("TestIckle") 
    {
    }

    public DbSet<Project> Projects { get; set; }
    public DbSet<TestCase> TestCases { get; set; }
}

私のコードでこれをしようとすると、うまくいきません:

    Console.WriteLine(_db.Configuration.LazyLoadingEnabled); //prints true
TestDbContext _db = new TestDbContext();
var testcase = _db.TestCases.Create();
testcase.Project = _db.Projects.Find(7);

//the following line outputs 0 with Code-First
//the following line outputs 7 with DB-First
Console.WriteLine(testcase.ProjectId);

コード優先モデルは、データベース優先モデルよりも機能が劣りますか? nav プロパティとそれに pkey を割り当てたのは奇妙に思えます。

以下は機能するはずですか?

var x = _db.TestCases.Create();
x.ProjectId = 7;
Console.WriteLine(x.Project.Name); //this never seems to work

x もどのコンテキストがアタッチされているかを知っているので、この状況を処理できたと思います。

ありがとう。

4

1 に答える 1

0

最後の 2 つの例では、これらのリレーションシップをデータベースにコミットしていないため、Entity Framework はこれらのエンティティを読み込んでいません。ナビゲーション プロパティを割り当てたときに FK ID が自動的に入力されることはありません。また、ID を設定しただけでナビゲーション プロパティが入力されることもありません。

ただし、Entity Framework は、これらのプロパティ (つまり、ID またはナビゲーション プロパティ) のいずれかに割り当てると、将来的に両方のプロパティに正しい値が入力されることを認識できるほどスマートです。ただし、実際のコミットを行う前に、その値を自動的に設定することはわかりません。考えてみれば、そうすべきではありません。これらのプロパティの 1 つにマップされるページにドロップダウンがあるとどうなるでしょうか? ユーザーがクリックするたびに、マッピングを正しく保持するためにデータベース呼び出しが必要になります。これは、はるかに遅く、はるかに壊れやすいアプリケーションに変換される可能性があります.

于 2013-03-19T15:25:41.400 に答える