Entity framework 从导航属性创建新条目
Entity framework creating new entries from navigation properties
我有以下型号:
public class Conversation
{
public int ConversationId { get; set; }
public virtual User Owner { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual ICollection<Conversation> Conversations { get; set; }
}
我到达了以下终点:
private DirectAPIContext db = new DirectAPIContext();
[HttpPost]
public async Task<Conversation> CreateConversation([FromBody] Conversation conversation)
{
Conversation newConversation = conversation;
db.Conversations.Add(newConversation);
await db.SaveChangesAsync();
return newConversation;
}
有了这个数据:
{
"ConversationId": 7,
"Owner": {
"UserId": 27,
"Name": null,
"Conversations": null
},
"Users": [
{
"UserId": 28,
"Name": null,
"Conversations": null
},
{
"UserId": 29,
"Name": null,
"Conversations": null
},
{
"UserId": 30,
"Name": null,
"Conversations": null
}
]
}
不是引用预先存在的用户对象 Entity Framework 而是像这样创建新的用户对象:
{
"ConversationId": 7,
"Owner": {
"UserId": 27,
"Name": null,
"Conversations": null
},
"Users": [
{
"UserId": 28,
"Name": null,
"Conversations": null
},
{
"UserId": 29,
"Name": null,
"Conversations": null
},
{
"UserId": 30,
"Name": null,
"Conversations": null
}
]
}
我不确定我是否错误地设置了导航属性。 Conversation和User之间的关系应该是多对多的。
是的,这是预期的行为。 EF 将尝试插入您添加的任何对象(直接或通过导航 属性),除非该对象已附加到跟踪图。在这种情况下,它将改为添加相关的 FK 或 link table 行。
您要做的是对数据库中已有的每个用户调用 db.Users.Attach(user)
。这应该会给你预期的行为(例如添加 link 行而不是插入新的用户行)
我有以下型号:
public class Conversation
{
public int ConversationId { get; set; }
public virtual User Owner { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual ICollection<Conversation> Conversations { get; set; }
}
我到达了以下终点:
private DirectAPIContext db = new DirectAPIContext();
[HttpPost]
public async Task<Conversation> CreateConversation([FromBody] Conversation conversation)
{
Conversation newConversation = conversation;
db.Conversations.Add(newConversation);
await db.SaveChangesAsync();
return newConversation;
}
有了这个数据:
{
"ConversationId": 7,
"Owner": {
"UserId": 27,
"Name": null,
"Conversations": null
},
"Users": [
{
"UserId": 28,
"Name": null,
"Conversations": null
},
{
"UserId": 29,
"Name": null,
"Conversations": null
},
{
"UserId": 30,
"Name": null,
"Conversations": null
}
]
}
不是引用预先存在的用户对象 Entity Framework 而是像这样创建新的用户对象:
{
"ConversationId": 7,
"Owner": {
"UserId": 27,
"Name": null,
"Conversations": null
},
"Users": [
{
"UserId": 28,
"Name": null,
"Conversations": null
},
{
"UserId": 29,
"Name": null,
"Conversations": null
},
{
"UserId": 30,
"Name": null,
"Conversations": null
}
]
}
我不确定我是否错误地设置了导航属性。 Conversation和User之间的关系应该是多对多的。
是的,这是预期的行为。 EF 将尝试插入您添加的任何对象(直接或通过导航 属性),除非该对象已附加到跟踪图。在这种情况下,它将改为添加相关的 FK 或 link table 行。
您要做的是对数据库中已有的每个用户调用 db.Users.Attach(user)
。这应该会给你预期的行为(例如添加 link 行而不是插入新的用户行)