仅连接一端的实体框架

时间:2016-08-31 15:13:01

标签: c# entity-framework

如果我有用户

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;
    }

1 个答案:

答案 0 :(得分:0)

我可以通过两种方式建议配置一对一关系:

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

此处地址将具有自己的标识列,以及具有FK到用户的User_Id列。

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

此处地址将具有自己的标识列,并且用户将具有带有FK到地址的Address_Id列。

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

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

这样做的缺点是你必须实现逻辑以确保每个用户只能有一个地址。

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