0

Entity Framework 5 でオプションの 1 対 1 ナビゲーション プロパティを null に設定しても、データベースに到達しないようです。これは予想される動作ですか?

以下の例では、Person がプロキシ オブジェクトです。アドレスを null に設定すると、アドレスがデータベースから削除されると思います。

null を設定する前にアドレスを遅延ロードすると、以下のコードが機能します。しかし、前にアドレスをロードする

どんな助けでも大歓迎です。

namespace ConsoleApplication2
{
using System;
using System.Data.Entity;

internal class Program
{
    private static void Main(string[] args)
    {
        using (PersonContext context = new PersonContext())
        {
            // Make sure person with Id = 1 exists with an address.
            Person person = context.People.Find(1) ?? context.People.Add(new Person { Id = 1 });
            if (person.Address == null)
            {
                person.Address = new Address
                    {
                        Street = "123 Main Street",
                        City = "SomeCity",
                        State = new State
                        {
                            Code = "NY",
                            Name = "New York"
                        },
                        Zip = "11771"
                    };
            }
            context.SaveChanges();
        }

        // Setting address to null should remove relationship 
        using (PersonContext context = new PersonContext())
        {
            Person person = context.People.Find(1);

            Console.WriteLine("Person is a " + person.GetType());

            person.Address = null;
            context.SaveChanges();

            if (person.Address == null)
            {
                Console.WriteLine("Success: Person.Address is null.");
            }
            else
            {
                Console.WriteLine("Failure: Person.Address is not null.");
            }
        }
    }
}

public class Person
{
    public int Id { get; set; }
    public virtual Address Address { get; set; }
}

public class Address
{
    public int Person_Id { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public int StateId { get; set; }
    public State State { get; set; }
    public string Zip { get; set; }
}

public class State
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

public class PersonContext : DbContext
{
    public DbSet<Person> People { get; set; }

    public DbSet<State> States { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Address>()
            .HasKey(x => x.Person_Id);

        modelBuilder.Entity<Person>()
            .HasOptional<Address>(x => x.Address)
            .WithRequired()
            .WillCascadeOnDelete();
    }
}

}

4

1 に答える 1

0

遅延読み込みを使用していない場合、Address などの関連プロパティは読み込まれないため、既に null になっています。

常に読み込まれるようにするには、eager loading を使用します。

Person person = context.People.Include(x => x.Address).Single(x => x.Id == 1);
于 2013-01-31T07:29:26.780 に答える