如何在同一实例上使用 entity framework 获取完整对象?

How to get complete object with entity framework on same instance?

我有以下实体:

public partial class ApplicationIntegration
{
    public int IntegrationId { get; set; }
    public int ApplicationId { get; set; }
    public bool ReceivesData { get; set; }
    public bool SendsData { get; set; }

    public virtual Application Application { get; set; }
}

public partial class Application
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Application()
    {
        this.ApplicationIntegrations = new HashSet<ApplicationIntegration>();
    }

    public int ApplicationId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool IsActive { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<ApplicationIntegration> ApplicationIntegrations { get; set; }
}

现在,这是我的 class 添加和获取应用程序集成的地方:

public class ApplicationIntegrationsRepository : Repository
    {
        /// <summary>
        /// Method to add a new application integration
        /// </summary>
        /// <param name="applicationIntegration"></param>
        /// <returns></returns>
        public ApplicationIntegration AddApplicationIntegration(ApplicationIntegration applicationIntegration)
        {
            if (applicationIntegration != null)
            {
                Db.ApplicationIntegrations.Add(applicationIntegration);
                int outPut = Db.SaveChanges();

                //If record was inserted correctly
                if (outPut > 0)
                {
                    //Revive object
                    Db.Entry(applicationIntegration).GetDatabaseValues();
                    applicationIntegration = GetApplicationIntegrationById(applicationIntegration.IntegrationId);
                }
            }

            return applicationIntegration;
        }

        /// <summary>
        /// Method to get a specific application integration by ID
        /// </summary>
        /// <param name="applicationIntegrationId"></param>
        /// <returns></returns>
        public ApplicationIntegration GetApplicationIntegrationById(int applicationIntegrationId)
        {
            ApplicationIntegration applicationIntegration = Db.ApplicationIntegrations.FirstOrDefault(a => a.IntegrationId == applicationIntegrationId);
            return applicationIntegration;
        }
    }


public abstract class Repository
    {
        /// <summary>
        /// Example Entities Connection String
        /// </summary>
        protected ExampleEntities Db { get; set; }

        /// <summary>
        /// Repository Constructor
        /// </summary>
        protected Repository()
        {
            Db = new ExampleEntities();
        }
    }

将变量传递到 AddApplicationIntegration 时,我只包含简单变量(IntegrationId = 0、ApplicationId = {应用程序 ID}、ReceivesData = {true 或 false}、SendsData = {true 或 false})。我将应用程序保留为空。

然后我添加到数据库,它插入正确。但是,一旦我检索到该对象,即使之后调用 GetApplicationIntegrationById,它也将始终 return 属性 Application 为 null。

我找到了解决这个问题的方法。

ApplicationIntegrationsRepository _applicationIntegrationsRepository = new ApplicationIntegrationsRepository();
ApplicationIntegration applicationIntegration = new ApplicationIntegration{IntegrationId = 0, ApplicationId = 1, ReceivesData = false, SendsData = true};
ApplicationIntegration entityObject = _applicationIntegrationsRepository.AddApplicationIntegration(applicationIntegration);
ApplicationIntegration applicationNull = _applicationIntegrationsRepository.GetApplicationIntegrationById(entityObject.IntegrationId);
ApplicationIntegration applicationNotNull = new ApplicationIntegrationsRepository().GetApplicationIntegrationById(entityObject.IntegrationId);

如果我声明另一个实例,它将获得完整的对象。我相信这与创建的数据库连接有关。

关于如何使用同一实例进行检索的任何想法?

您是否尝试过明确包含应用程序?

ApplicationIntegration applicationIntegration = Db.ApplicationIntegrations.Include(ap => ap.Application).FirstOrDefault(a => a.IntegrationId == applicationIntegrationId);

希望对您有所帮助。以下是 Include 在 lambda 上的一些示例。

EF Code First - Include(x => x.Properties.Entity) a 1 : Many association

Missing Entity Framework Include(lambda) extension

Using Include in Entity Framework 4 with lambda expressions

此致