2016-08-31 79 views
0

如果我有一个用户实体框架,只有一端连接

public class User : BaseEntity 
{ 
    public int Id { get; set; } 
    public AddressId {get;set;} 
    public Address Address {get; set;} 
} 

和地址类

public class Address : BaseEntity 
{ 
    public int Id { get; set; } 
} 

因此,只有这是一对一的,只有具有与该连接的用户另一端。

我该如何使用流畅的API来设置它,也可以使我的通用SaveOrUpdate方法考虑到一次性保存图吗?

public static async Task<T> SaveOrUpdateAsync<T>(this GSCMContext context, T updated) where T : BaseEntity 
    { 
     if (updated == null) 
      return null; 

     if (updated.IsPersisted) 
     { 
      T existing = context.Set<T>().Find(updated.Id); 
      if (existing != null) 
      { 
       context.Entry(existing).CurrentValues.SetValues(updated); 
       await context.SaveChangesAsync(); 
      } 

      return existing; 
     } 

     context.Set<T>().Add(updated); 
     await context.SaveChangesAsync(); 
     return updated; 
    } 

回答

0

有两种方法,我可以推荐配置一个一对一的关系:

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalPrincipal(); 

这里的地址将拥有自己的标识列,并与FK一个user_id列到用户。

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalDependent(); 

这里地址将有它自己的标识列,并且用户将有一个Address_Id列和FK到地址。

如果你想告诉EF,它应该在用户模型填充AddressId,您必须将关系配置为一个一对多:

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithMany().HasForeignKey(u => u.AddressId); 

这样做,你必须实现的缺点确保不超过一个地址与每个用户相关的逻辑。

请注意,根据需要配置一对一关系将导致EF重新使用主实体的Id作为依赖实体,即在依赖实体的表中不会有额外的FK列。