只有一端连接的实体框架
本文关键字:实体 框架 连接 | 更新日期: 2023-09-27 18:04:52
如果我有一个用户
public class User : BaseEntity
{
public int Id { get; set; }
public AddressId {get;set;}
public Address Address {get; set;}
}
和一个Address类
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;
}
我可以推荐两种配置一对一关系的方法:
ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalPrincipal();
这里Address将有自己的Identity列,和一个User_Id列,其中FK到User。
ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalDependent();
这里Address将有自己的Identity列,User将有一个Address_Id列,其中包含FK到Address。
如果您想告诉EF它应该在User模型中填充AddressId
,您必须将关系配置为一对多:
ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithMany().HasForeignKey(u => u.AddressId);
这有一个缺点,你必须实现逻辑,以确保不超过一个地址与每个用户相关。
请注意,根据需要配置一对一关系将导致EF为依赖实体重用主实体的Id,即在依赖实体的表中不会有额外的FK列。