C# EF代码第一个1:0..1关系共享主键

C# EF代码第一个1:0..1关系共享主键,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我需要建立一个1:0..1的关系模型。A类对B类有一个必需的引用,但B类可以在没有A类的情况下存在 我的理解(这可能是错误的)是,此EF只能以这样的方式创建此关系:类别a没有自己的主键,但使用与类别B相同的主键。类别a是依赖实体,类别B是主键 是否可以编辑现有类别A(带有指向特定类别B的链接)并将其更改为指向其他类别B的链接?它的主键会发生什么变化?引用A类的其他实体会发生什么情况?公共部分类PrimaryEntity public partial class PrimaryEntity {

我需要建立一个1:0..1的关系模型。A类对B类有一个必需的引用,但B类可以在没有A类的情况下存在

我的理解(这可能是错误的)是,此EF只能以这样的方式创建此关系:类别a没有自己的主键,但使用与类别B相同的主键。类别a是依赖实体,类别B是主键

是否可以编辑现有类别A(带有指向特定类别B的链接)并将其更改为指向其他类别B的链接?它的主键会发生什么变化?引用A类的其他实体会发生什么情况?

公共部分类PrimaryEntity
public partial class PrimaryEntity
{
    public PrimaryEntity()
    {
        ID = Guid.NewGuid();
    }
    [Key]
    public Guid ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

public partial class DependentEntity
{
    public DependentEntity()
    {
        ID = Guid.NewGuid();
    }
    [Key]
    public Guid ID { get; set; }
    public string Name { get; set; }

    public Guid CurrentPrimaryEntityId { get; set; }
    public virtual PrimaryEntity CurrentPrimaryEntity { get; set; } 
}
    // override this in DataContext
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DependentEntity>().HasRequired(a => a.CurrentPrimaryEntity).WithMany().HasForeignKey(a => a.CurrentPrimaryEntityId);
        base.OnModelCreating(modelBuilder);
    }

 protected override void Seed(MyDataComtext db)
    {
        // here is a restriction that FK must be unique
        db.Database.ExecuteSqlCommand("ALTER TABLE dbo.[DependentEntity] ADD CONSTRAINT uc_Dependent UNIQUE(CurrentPrimaryEntityId)");

    }

var primary = new PrimaryEntity();
 db.PrimaryEntity.Add(PrimaryEntity);
var dependent = new DependentEntity();
dependent.CurrentPrimaryEntity = primary;  
  db.DependentEntity.Add(dependent);
  db.SaveChanges();
{ 公共主要实体() { ID=Guid.NewGuid(); } [关键] 公共Guid ID{get;set;} 公共字符串名称{get;set;} 公共字符串值{get;set;} } 公共部分类依赖性 { 公共依赖性() { ID=Guid.NewGuid(); } [关键] 公共Guid ID{get;set;} 公共字符串名称{get;set;} 公共Guid CurrentPrimaryEntityId{get;set;} 公共虚拟主实体CurrentPrimaryEntity{get;set;} } //在DataContext中重写此选项 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasRequired(a=>a.CurrentPrimaryEntity).WithMany().HasForeignKey(a=>a.CurrentPrimaryEntityId); 基于模型创建(modelBuilder); } 受保护的覆盖无效种子(MyDataComtext db) { //这里有一个限制,即FK必须是唯一的 ExecuteSqlCommand(“ALTER TABLE dbo.[dependententy]ADD CONSTRAINT uc_Dependent UNIQUE(CurrentPrimaryEntityId)”; } var primary=新的PrimaryEntity(); db.PrimaryEntity.Add(PrimaryEntity); var dependent=新的依赖性(); dependent.CurrentPrimaryEntity=主要; db.dependenty.Add(依赖); db.SaveChanges();

类似这样的事情

我总是努力让自己的头脑清醒过来。这是违反直觉的,因为从来没有超过一个。所以,如果我想进一步限制它,这样就不会有超过一个依赖项链接到同一个主项,那么我想这取决于我的业务逻辑,而不是EF?我想这是您需要的。两个实体可能都有自己的PK。主项是独立的,甚至不知道依赖项。你的意思是你现在有了类A-B,它现在应该成为类模型中的A-C?或者两个对象a-b1,应该成为a-b2?Person类有一个对Address类的引用。一个人必须有一个地址,但地址可以用于其他类别,如公司。所以,当我创建一个人时,我也会创建一个地址。地址表保存主键,然后也将主键分配给此人。如果这个人“移动”会发生什么?历史数据(如交货)链接到旧地址,因此我不想只编辑该记录,我需要将旧地址保留在系统中。在这种情况下,我认为个人地址应该是多对多,而连接表有一个字段指示哪个地址是当前地址。您不能更改Person的主键(我假设其他实体引用它)。