C# 一个表怎么可能有两个可为空的FK,而其中只有一个有值?

C# 一个表怎么可能有两个可为空的FK,而其中只有一个有值?,c#,asp.net-core,ef-code-first,ef-core-2.2,C#,Asp.net Core,Ef Code First,Ef Core 2.2,我有一个项目,可以由组织的成员拥有,也可以由外部资源人员拥有。这意味着FKs MemberId或ExternalResourcePersonId中的每一个都可以为空,但不能同时为空。我如何建立这种关系 我刚开始在这里引入“外部资源人员”这个词。也许ExternalResourcePerson类应该有一个列表而不是列表 这些是课程: public class Project { public int Id { get; set; } // A Project can either

我有一个项目,可以由组织的成员拥有,也可以由外部资源人员拥有。这意味着FKs MemberId或ExternalResourcePersonId中的每一个都可以为空,但不能同时为空。我如何建立这种关系

我刚开始在这里引入“外部资源人员”这个词。也许ExternalResourcePerson类应该有一个列表而不是列表

这些是课程:

public class Project
{
    public int Id { get; set; }

    // A Project can either have a Member as owner ...
    public int MemberId { get; set; }
    public Member ProjectOwner { get; set; }

    // ... or an ExternalResourcePerson
    public int ExternalResourcePersonId { get; set; }
    public ExternalResourcePerson ExternalProjectOwner { get; set; }
}

public class Member
{
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Zip { get; set; }

    public List<Project> Projects { get; set; }
}

public class ExternalResourcePerson
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string Organisation { get; set; }
    public string Expertise { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Notes { get; set; }
    public List<ExternalResourcePersonEngagement> Engagements { get; set; }
}

public class ExternalResourcePersonEngagement
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public Project Project { get; set; }
    public int ExternalResourcePersonId { get; set; }
    public ExternalResourcePerson Person { get; set; }
}

我已经看到了,但我无法将任何答案应用到我的案例中。

只需将它们声明为可空,并添加负责正确分配它的方法

一些不是生产就绪解决方案的基本示例:

//Marker
public interface IProjectOwner
{

}

public class Project
{
    public int Id { get; set; }

    // A Project can either have a Member as owner ...
    public int? MemberId { get; private set; }
    public Member ProjectOwner { get; private set; }

    // ... or an ExternalResourcePerson
    public int? ExternalResourcePersonId { get; private set; }
    public ExternalResourcePerson ExternalProjectOwner { get; private set; }

    public void SetProjectOwner(IProjectOwner projectOwner)
    {    
        //Add some validation for this. Like checking if the project owner is set.
        if(projectOwner == null)
            throw new Exception("Project owner cannot be null.");

        if(projectOwner is Member )
        {
            ProjectOwner = projectOwner;
            MemberId = projectOwner.Id;
        }

        if(projectOwner is ExternalResourcePerson)
        {
            ExternalProjectOwner = projectOwner;
            ExternalResourcePersonId = projectOwner.Id;
        }
    }
}

public class Member : IProjectOwner
{
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Zip { get; set; }

    public List<Project> Projects { get; set; }
}

public class ExternalResourcePerson : IProjectOwner
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string Organisation { get; set; }
    public string Expertise { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Notes { get; set; }
    public List<ExternalResourcePersonEngagement> Engagements { get; set; }
}

public class ExternalResourcePersonEngagement
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public Project Project { get; set; }
    public int ExternalResourcePersonId { get; set; }
    public ExternalResourcePerson Person { get; set; }
}

您还可以添加一些方法来检索此人。

我没有使用任何接口内容,只是简单地将它们设置为null,然后在控制器中确保一个且只有一个具有值,这样做了!: