質問

I have this model:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Student : Person
{
    public string Code { get; set; }
}

and this context:

public class Context : DbContext
{
    public Context()
        : base("Context")
    {
        Database.SetInitializer<Context>(null);
    }

    public DbSet<Student> Students { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().ToTable("People");
        modelBuilder.Entity<Student>().ToTable("Students");
    }
}

And I want to be able to insert an instance of Student without code first, and then later at some future point, I want to update that Student's code. Here is a simple code explanation:

var student = new Student
{
    FirstName = "Saeed",
    LastName = "Nemati",
};
using (var context = new Context())
{
    context.Students.Add(student);
    context.SaveChanges();
}

// A month later I want to update the code
var student2 = new Student
{
    Id = student.Id,
    Code = "something"
};
using (var context = new Context())
{
    context.Students.Attach(student2);
    context.Entry(student2).State = EntityState.Modified;
    context.SaveChanges();
}

The problem is, EF complaints that FirstName and LastName should be provided and can't be null. I can populate Student inherited properties from Person properties, but this sounds smelly. Is there any approach or technique in EF to update the derived class (dependent table) in isolation?

役に立ちましたか?

解決

This is simple.When you modify state student2 entity framework thinks FirstName and LastName are null. Instead using:

context.Entry(student2).State = EntityState.Modified;

You should change Property:

context.Entry(student2).Property(x => x.Code).IsModified = true;

他のヒント

Try this:

using (var context = new Context())
{
    var student2 = context.Students.SingleOrDefault(x=>x.Id == yourID);

    student2.Code = "Something";

    context.Students.Attach(student2);
    context.Entry(student2).State = EntityState.Modified;
    context.SaveChanges();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top