Пример/код:
Код: Выделить всё
public class Context : DbContext
{
public DbSet Users { get; set; }
public DbSet UserDatas { get; set; }
public DbSet Sessions { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
CreateRelationships(modelBuilder);
CreateIndexs(modelBuilder);
}
private void CreateRelationships(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasOne(e => e.UserData)
.WithOne(e => e.User)
.HasForeignKey(e => e.UserID)
.IsRequired();
modelBuilder.Entity()
.HasOne(e => e.Session)
.WithOne(e => e.User)
.HasForeignKey(e => e.UserID)
.IsRequired();
modelBuilder.Entity()
.Navigation(u => u.Session)
.AutoInclude();
modelBuilder.Entity()
.Navigation(u => u.UserData)
.AutoInclude();
}
public bool GetUserByCondition(System.Linq.Expressions.Expression predicate, out User? user)
{
user = Users.FirstOrDefault(predicate);
if (user == null)
{
return false;
}
Log.LogToDB($"UserData is null: {user.UserData == null}");
Log.LogToDB($"Session is null: {user.Session == null}");
Log.LogToDB($"User ID: {user.UserID}");
// TODO: Figure out why eager loading isn't working
Entry(user).Reference(u => u.Session).Load();
Log.LogToDB($"Session ID: {user.Session.SessionID}");
Entry(user).Reference(u => u.UserData).Load();
Log.LogToDB($"UserData ID: {user.UserData.UserDataID}");
// for some reason the context will think all of these are being added after updating them and calling .SaveChanges(). Manually attach them to fix this
Attach(user);
Attach(user.Session);
// Exception throwing because user.UserData.UserDataID = 0 / is unset
Attach(user.UserData);
return true;
}
}
public class User : IUser
{
[Key]
public long UserID { get; set; }
public UserData UserData { get; set; }
public Session Session { get; set; }
protected User() { }
public User(Context db)
{
UserData ud = new UserData(this);
UserData = ud;
db.UserDatas.Add(ud);
}
}
public class Session : ISession
{
[Key]
public long SessionID { get; set; }
public long UserID { get; set; }
public User User { get; set; }
protected Session() { }
static public Session CreateSessionForUser(User user, out string token)
{
Session session = new Session()
{
UserID = user.UserID,
User = user,
};
return session;
}
}
static public class SessionHelper
{
static public void CreateNewSessionForUser(Context db, User user)
{
Session newSession = Session.CreateSessionForUser(user, out token);
db.Sessions.Add(newSession);
db.SaveChanges();
}
}
public class UserData : IUserData
{
[Key]
public long UserDataID { get; set; }
public long UserID { get; set; }
public User User { get; set; }
}
После ручной загрузки сеанса через
Код: Выделить всё
Entry(user).Reference(u => u.Session).Load();
[img]https:// i.sstatic.net/pWEu0gfg.png[/img]


Любая помощь в объяснении того, почему Entity Framework Core не может получить первичный ключ в UserDatas, будет оценена по достоинству
Подробнее здесь: https://stackoverflow.com/questions/783 ... rimary-key
Мобильная версия