.net 一对一关系首先指定ef代码中创建的对象

.net 一对一关系首先指定ef代码中创建的对象,.net,entity-framework,ef-code-first,.net,Entity Framework,Ef Code First,我有两个这样的实体 public class User : IdentityUser { public virtual Company RegisteredCompany { get; set; } .. } public class Company { public int Id { get; set; } public string Name { get; set; } } 当我尝试使用创建的公司创建新用户时 using (var ctx = new AppCo

我有两个这样的实体

public class User : IdentityUser
{
    public virtual Company RegisteredCompany { get; set; }

..
}
public class Company
{
    public int Id { get; set; }

    public string Name { get; set; }
}
当我尝试使用创建的公司创建新用户时

using (var ctx = new AppContext())
{
    var company = ctx.Companies.SingleOrDefault(c => c.Id == model.CompanyId);

    ...
        var user = new User
                       {
                           UserName = model.Msisdn, 
                           RegisteredCompany = company,
                           ...
                       };

        var result = await this.UserManager.CreateAsync(user, Helper.GetUniqueKey(30));
        if (!result.Succeeded)
        {
            ...
        }

    ...

}
我得到这样的错误

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
var company = ctx.Companies.AsNoTracking().SingleOrDefault(c => c.Id == model.CompanyId);
如果我像这样分离上下文中的对象

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
var company = ctx.Companies.AsNoTracking().SingleOrDefault(c => c.Id == model.CompanyId);

当然,它可以在数据库中看到新对象并创建新公司。如何将现有公司分配给新用户?

如果要将现有实体作为导航分配给新用户,则必须将用户保存在获取公司的位置,或者必须使用外键关联,如果我不理解错误,只需说
user.CompanyID=…
,您更喜欢创建这样的实体
public int RegisteredCompanyId{get;set;}[ForeignKey(“RegisteredCompanyId”)]public virtual Company RegisteredCompany{get;set;}
我不喜欢它,但如果您必须跨上下文使用导航属性,这几乎是唯一的方法。如果您可以更改
UserManager.CreateAsync
方法,您还可以将当前上下文传递给它,它应该可以工作。感谢帮助。我正在处理ITI如果您想将现有实体作为导航分配给新用户,您必须将用户保存在获取公司的位置,或者,您必须使用外键关联,只需说
User.CompanyID=…
如果我没有理解错,您更愿意创建这样的实体
public int RegisteredCompanyId{get;set;}[ForeignKey(“RegisteredCompanyId”)]public virtual Company RegisteredCompany{get;set;}
我不喜欢它,但如果必须跨上下文使用导航属性,这几乎是唯一的方法。如果您可以更改
UserManager.CreateAsync
方法,您还可以将当前上下文传递给它,它应该可以工作。谢谢您的帮助。我正在处理它