C# EF代码中的非空多对零或一关系优先?

C# EF代码中的非空多对零或一关系优先?,c#,asp.net-mvc,entity-framework,ef-code-first,C#,Asp.net Mvc,Entity Framework,Ef Code First,我有一个典型的一对多关系,除了在“多”方面没有每个项目的“一”。这是我的桌子: 会话: ID IP 1 1.1.1.1 2 2.2.2.2 IP NAME 1.1.1.1 John 用户: ID IP 1 1.1.1.1 2 2.2.2.2 IP NAME 1.1.1.1 John …由以下POCO生成: public class Session { p

我有一个典型的一对多关系,除了在“多”方面没有每个项目的“一”。这是我的桌子:

会话:

ID        IP
1         1.1.1.1
2         2.2.2.2
IP        NAME
1.1.1.1   John
用户:

ID        IP
1         1.1.1.1
2         2.2.2.2
IP        NAME
1.1.1.1   John
…由以下POCO生成:

public class Session {
    public int     id   { get; set; }
    public long    ip   { get; set; }
}

public class User {
    [Key]
    public long    ip   { get; set; }
    public string  name { get; set; }
    public ICollection<Session> sessions { get; set; }
}
公开课{
公共int id{get;set;}
公共长ip{get;set;}
}
公共类用户{
[关键]
公共长ip{get;set;}
公共字符串名称{get;set;}
公共ICollection会话{get;set;}
}
某些会话具有相应的用户(通过IP)。即使没有关联的用户,我也希望保留IP,并且能够导航user.sessions

使用上述POCO,EF将从
Session.ip
User.ip
,生成一个FK,这是可以理解的,从而防止我插入与用户无关的ip会话。使
Session.ip
null可用于插入与用户无关的会话,但随后我会丢失该ip(它必须为null)

有没有办法做到这一点


非常感谢。

我将修改POCO类,如下所示:

 public class Session
{
    public int id { get; set; }
    public long ip { get; set; }      
    public User User {get;set;}
}

public class User
{
    [Key]
    public int id { get; set; }
    public long ip { get; set; }
    public string name { get; set; }
    public ICollection<Session> sessions { get; set; }
}
公开课
{
公共int id{get;set;}
公共长ip{get;set;}
公共用户{get;set;}
}
公共类用户
{
[关键]
公共int id{get;set;}
公共长ip{get;set;}
公共字符串名称{get;set;}
公共ICollection会话{get;set;}
}
这将在会话表上创建一个可为空的User_id字段,并将为您提供所需的结果。请注意,这已删除ip作为用户表上的PK,并将其更改为通用整数id


希望这有帮助

我会这样修改POCO类:

 public class Session
{
    public int id { get; set; }
    public long ip { get; set; }      
    public User User {get;set;}
}

public class User
{
    [Key]
    public int id { get; set; }
    public long ip { get; set; }
    public string name { get; set; }
    public ICollection<Session> sessions { get; set; }
}
公开课
{
公共int id{get;set;}
公共长ip{get;set;}
公共用户{get;set;}
}
公共类用户
{
[关键]
公共int id{get;set;}
公共长ip{get;set;}
公共字符串名称{get;set;}
公共ICollection会话{get;set;}
}
这将在会话表上创建一个可为空的User_id字段,并将为您提供所需的结果。请注意,这已删除ip作为用户表上的PK,并将其更改为通用整数id


希望这有帮助

谢谢。我也考虑过这个解决方法,但想知道是否有一个根本的解决方案。我的Sessions表很大(每天有1+gb的新数据),出于性能原因,我不想存储不必要的列,也不想尝试避免使用Nullable。您是否尝试在dbContext中重写OnModelCreating。。。我认为您可以删除外键(modelBuilder.Entity().HasMany(x=>x.sessions).WithOptional())}否,这与将Session.ip定义为null具有相同的效果,即它生成的FK必须为null或指向有效用户,但无法指向不存在的用户。除了完全删除FK并在应用程序中强制执行约束之外,没有其他解决方案。谢谢。我也考虑过这个解决方法,但想知道是否有一个根本的解决方案。我的Sessions表很大(每天有1+gb的新数据),出于性能原因,我不想存储不必要的列,也不想尝试避免使用Nullable。您是否尝试在dbContext中重写OnModelCreating。。。我认为您可以删除外键(modelBuilder.Entity().HasMany(x=>x.sessions).WithOptional())}否,这与将Session.ip定义为null具有相同的效果,即它生成的FK必须为null或指向有效用户,但无法指向不存在的用户。除了完全删除FK并在应用程序中强制执行约束外,没有其他解决方案。