public partial class MyDbContext : DbContext
{
public MyDbContext()
: base("name=Model1")
{
}
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<UserGroup> UserGroups { get; set; }
public virtual DbSet<UserGroupMember> UserGroupMembers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { }
}
[Table("gnr.UserGroup")]
public partial class UserGroup
{
public UserGroup()
{
ChildUserGroups = new HashSet<UserGroupMember>();
UserGroupMembers = new HashSet<UserGroupMember>();
}
public long ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
[InverseProperty("ChildUserGroup")]
public virtual ICollection<UserGroupMember> ChildUserGroupMembers { get; set; }
[InverseProperty("UserGroup")]
public virtual ICollection<UserGroupMember> UserGroupMembers { get; set; }
}
[Table("gnr.UserGroupMember")]
public partial class UserGroupMember
{
public long ID { get; set; }
public long? UserID { get; set; }
public virtual User User { get; set; }
[ForeignKey("UserGroup")]
public long UserGroupID { get; set; }
public virtual UserGroup UserGroup { get; set; }
[ForeignKey("ChildUserGroup")]
public long? ChildUserGroupID { get; set; }
public virtual UserGroup ChildUserGroup { get; set; }
}
[Table("gnr.User")]
public partial class User
{
public User()
{
UserGroupMembers = new HashSet<UserGroupMember>();
}
public long ID { get; set; }
public string Username { get; set; }
public string MobileNumber { get; set; }
public virtual ICollection<UserGroupMember> UserGroupMembers { get; set; }
}
static void Main(string[] args)
{
WorkNotCorrectly();
Console.WriteLine("Done");
Console.ReadLine();
}
private static void WorkNotCorrectly()
{
using (var db = new MyDbContext())
{
var ug = new UserGroup { Title = "It's a new UserGroup 1" };
var cugm = new UserGroupMember { ChildUserGroupID = 1 };
ug.ChildUserGroupMembers.Add(cugm);
// After This Line
db.UserGroups.Add(ug);
的MyDbContext設置「cugm」對象「ChildUserGroup」屬性設置爲「微克」實體框架的DbContext混亂當同桌指着
但預期的行爲兩個外鍵是設置「 cugm用戶組」的特性 '' 對象的 '微克'
'微克' 對象到JSON:
{
"ID": 0,
"Title": "It's a new UserGroup 1",
"Description": null,
"ChildUserGroupMembers": [
{
"ID": 0,
"UserID": null,
"User": null,
"UserGroupID": 0,
"UserGroup": null,
"ChildUserGroup": HERE IS THE PROBLEM => The MyDbContext sets the 'ChildUserGroup' property instead of 'UserGroup' property,
"ChildUserGroupID": 1
}
],
"UserGroupMembers": []
}
而且調用SaveChanges:
db.SaveChanges();
}
}
'微克' 對象到JSON後的SaveChanges:
{
"ID": 2,
"Title": "It's a new UserGroup 1",
"Description": null,
"ChildUserGroupMembers": [
{
"ID": 1,
"UserID": null,
"User": null,
"UserGroupID": 2,
"ChildUserGroupID": 2 WHAT???? IT IS CHANGED TO 2 (THE NEW UserGroup THAT IS GENERATED),
"ChildUserGroup": HERE IS THE PROBLEM => The MyDbContext sets the 'ChildUserGroup' property instead of 'UserGroup' property
}
],
????? WHAT IS THIS??? WHY UserGroupMembers PROPERTY IS FILLED
"UserGroupMembers": [
{
"ID": 1,
"UserID": null,
"User": null,
"UserGroupID": 2,
"ChildUserGroupID": 2
}
]
}
預期的行爲,結果是:
{
"ID": 2,
"Title": "It's a new UserGroup 1",
"Description": null,
"ChildUserGroupMembers": [
{
"ID": 1,
"UserID": null,
"User": null,
"UserGroupID": 2,
"UserGroup": 'The ug object with ID of 2 ',
"ChildUserGroupID": 1
}
]
}
Result in SSMS and the relationship diagram
看來,EF困惑,以確定正確的FK,在插入物體和由我填充的物體後必須自己填充的物體?!!
更新: 這是實體之間的關係:
UserGroupMember是用戶組和用戶之間的橋樑表
可以爲每個用戶1個... *用戶組
成員每個用戶組可以有1 ... *用戶作爲成員
(在此之前它像一個正常的橋接表來表示多對多的關係)
4.每個用戶組可以有1 ... * ChildUserGroup作爲成員
(這意味着一個UserGroup可以有一個User或一個ChildUserGroup作爲成員,就像Windows的'用戶和組')
真誠。
https://stackoverflow.com/help/mcve – mjwills
你能解釋ChildUserGroup是什麼?它是兩個UserGroups之間的關係,還是它是另一個UserGroup的成員UserGroup?你的模型似乎混淆了兩者之間。 –
鑑於'ChildUserGroup'和'ChildUserGroupMembers'是一對關係,你爲什麼認爲向'ChildUserGroupMembers'集合中添加'cugm'不應該將'ChildUserGroup'設置爲'ug'? – Smit