2014-01-17 216 views
0

我有一个我需要建模的关系是1:0..1。 A类对B类有要求的参考,但B类可以不存在A类。EF代码第一个1:0..1关系共享主键

我的理解(这可能是错误的)是这个EF只能创建这种关系,使得A类没有它自己的主键,但与B类使用相同的主键.A类是依赖实体,B类是主键。

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

+0

你的意思是你现在有*类* A-B,它现在应该成为A-C中的类模型?或者两个*对象* a-b1,它应该成为a-b2? –

+0

人员类别具有对地址类别的引用。一个人必须有一个地址,但地址可以用于其他类,如公司。所以,当我创建一个人时,我也会用它创建一个地址。地址表中保存主键,然后将其分配给该人。如果人“移动”会发生什么?历史数据(如交货)与旧地址相关联,因此我不想仅编辑该记录,我需要将旧地址保留在系统中。 –

+0

在这种情况下,我认为Person-Address应该是多对多的,而交接表有一个指示哪个地址是当前的字段。您不能更改Person的主键(我假定其他实体引用它)。 –

回答

1
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(); 

像这样

+0

这是“WithMany”,我总是努力想办法解决问题。这是违反直觉的,因为没有多一个。所以,如果我想限制进一步限制它,以便从不多于一个依赖链接到同一个主链,那么我想这是关于我的业务逻辑,而不是EF? –

+0

我想这是你需要的。两个实体都可能拥有自己的PK。主要项目是独立的,甚至不了解依赖项目。 – potehin143