EF Core中关系的行为,创建对象时的并发性

时间:2018-03-20 22:09:23

标签: c# entity-framework-core

我遇到了Entity框架Core 2.0.2的问题,我想知道是否有人可以启发我。

我所拥有的是一个包含电话号码集的人员班级。

public class Person : BaseEntity
{
    [Required]
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string Context { get; set; }
    public string Email { get; set; }

    public ICollection<PhoneNumber> PhoneNumbers { get; set; } = new List<PhoneNumber>();
}

******中国

public class PhoneNumber : BaseEntity
{
    public string Usage { get; set; }

    public int PersonId { get; set; }
    public Person Person { get; set; }
}

BaseEntity基本上只是一个带有id的属性。

然后我有一个通用的回购

存储库

public class Repository<T> where T : BaseEntity
{
    private readonly Dab2_2RdbContext _context;

    public Repository(Dab2_2RdbContext context)
    {
        _context = context;
    }

    public void Create(T t)
    {
        _context.Entry<T>(t).State = EntityState.Added;
        _context.SaveChanges();
    }

    public T Read(int id)
    {
        return _context.Find<T>(id);
    }
    public void Update(int id, T t)
    {
        _context.Entry<T>(t).State = EntityState.Modified;
        _context.SaveChanges();
    }
    public void Delete(T t)
    {
        _context.Entry<T>(t).State = EntityState.Deleted;
        _context.SaveChanges();
    }
}

所有这些代码都很简单,工作正常。 当我像这样测试代码时会出现这种情况:

var context = new Dab2_2RdbContext();
var personRepo = new Repository<Person>(context);
var phoneNumberRepo = new Repository<PhoneNumber>(context);

var person = new Person()
{
    FirstName = "Kasper",
    LastName = "Lastname",
    Email = "Something@gmail.com",
    Context = "Myself",
};

person.PhoneNumbers = new List<PhoneNumber>()
{
    new PhoneNumber() {Usage = "Work"},
    new PhoneNumber() {Usage = "School"}
};

// Create
personRepo.Create(person);

此代码生成具有适当值的人员,但不包括电话号码。

var context = new Dab2_2RdbContext();
var personRepo = new Repository<Person>(context);
var phoneNumberRepo = new Repository<PhoneNumber>(context);

var person = new Person()
{
    FirstName = "Kasper",
    LastName = "Lastname",
    Email = "Something@gmail.com",
    Context = "Myself",
};

// Create
personRepo.Create(person);

person.PhoneNumbers = new List<PhoneNumber>()
{
    new PhoneNumber() {Usage = "Work"},
    new PhoneNumber() {Usage = "School"}
};
personRepo.Update(person.Id, person);

此代码建立了正确的关系(该人。已经建立了phonenumber关系。注意//创建人,转移到人之上。电话号码

我想知道是否有人可以启发我,我真的可以弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:0)

答案是设置条目的状态。只会跟踪实体,而不会跟踪它的属性。而添加将跟踪所有导航属性。