只有一端连接的实体框架

本文关键字:实体 框架 连接 | 更新日期: 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列。