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