如何在同一实例上使用 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
此致
我有以下实体:
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
此致