C# 2个不同独立表中的基类和子类模型
我应该缓存传入的数据。我有两个模型OrderModel和OrderDetailedModel,其中OrderModel是基类,OrderDetailedModel是子类 用户首先打开订单列表-仅检索一些数据(订单模型列表)。应该缓存此列表 当用户选择一个特定的订单时,所有的信息都被保存(OrderDetailedModel),这也应该被缓存 重要的是,当再次下载列表时,我不希望缓存的OrderDetailedModel行被OrderModel覆盖。(不想清除详细信息) 我尝试创建两个不同的数据库集:C# 2个不同独立表中的基类和子类模型,c#,.net,entity-framework,C#,.net,Entity Framework,我应该缓存传入的数据。我有两个模型OrderModel和OrderDetailedModel,其中OrderModel是基类,OrderDetailedModel是子类 用户首先打开订单列表-仅检索一些数据(订单模型列表)。应该缓存此列表 当用户选择一个特定的订单时,所有的信息都被保存(OrderDetailedModel),这也应该被缓存 重要的是,当再次下载列表时,我不希望缓存的OrderDetailedModel行被OrderModel覆盖。(不想清除详细信息) 我尝试创建两个不同的数据库
public DbSet<OrderModel> Orders { get; set; }
public DbSet<OrderDetailedModel> OrderDetails { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<OrderDetailedModel>().Map(m =>
{
//m.MapInheritedProperties(); // this doesn't help either
m.ToTable("OrderDetails");
});
modelBuilder.Entity<OrderModel>().Map(m =>
{
//m.MapInheritedProperties();
m.ToTable("Orders");
});
}
订单详情:
{SELECT
N'0X0X' AS [C1],
[Extent1].[Id] AS [Id],
...
[Extent1].[StoreContact] AS [StoreContact],
...
FROM [OrderDetails] AS [Extent1]
INNER JOIN [Orders] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]}
这将导致一个错误:
var a = Entry<T>(detailedOrderObject);
您的类仍然是连接的,因为您的OrderDetailedModel类是从OrderModel派生的,并且在查询表时EF会感到困惑 也就是说,我认为您应该绝对地将它们分割成两个单独的表,如果没有其他原因,除了规范化您的数据库。要分离它,您需要在代码中包含ForeignKey属性,并停止从OrderModel派生OrderDetailedModel类 假设OrderModel:OrderDetailedModel为1:1,您将执行以下操作: 将此添加到OrderModel:
public virtual OrderDetailedModel OrderDetails { get; set; }
对于OrderDetailedModel,您可以使用以下注释(任何其他注释,如JsonProperty注释也可以保留——我只是向您展示您需要的EF注释):
让我知道它是如何工作的。您的类仍然是连接的,因为您的OrderDetailedModel类是从OrderModel派生的,当您查询表时,EF会感到困惑 也就是说,我认为您应该绝对地将它们分割成两个单独的表,如果没有其他原因,除了规范化您的数据库。要分离它,您需要在代码中包含ForeignKey属性,并停止从OrderModel派生OrderDetailedModel类 假设OrderModel:OrderDetailedModel为1:1,您将执行以下操作: 将此添加到OrderModel:
public virtual OrderDetailedModel OrderDetails { get; set; }
对于OrderDetailedModel,您可以使用以下注释(任何其他注释,如JsonProperty注释也可以保留——我只是向您展示您需要的EF注释):
让我知道它是如何工作的。为了防止有人需要保留继承,我发布了一个我创建的解决方案:
public class OrderModel
{
protected bool _detailed;
[Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(PropertyName = "order_id")]
public int Id { get; set; }
[Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public bool Detailed
{
get { return _detailed; }
set
{
if( (this.GetType() == typeof(OrderModel) && value== true) ||
(this.GetType() == typeof(OrderDetailedModel) && value==false))
throw new ArgumentException("This property is restricted");
_detailed = value;
}
}
//....
public OrderModel()
{
_detailed = false;
}
}
public class OrderDetailedModel :OrderModel
{
//.....
public OrderDetailedModel()
{
_detailed = true;
}
}
它并不漂亮,但很有效。为了防止有人需要保留继承权,我发布了一个我创建的解决方案:
public class OrderModel
{
protected bool _detailed;
[Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(PropertyName = "order_id")]
public int Id { get; set; }
[Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public bool Detailed
{
get { return _detailed; }
set
{
if( (this.GetType() == typeof(OrderModel) && value== true) ||
(this.GetType() == typeof(OrderDetailedModel) && value==false))
throw new ArgumentException("This property is restricted");
_detailed = value;
}
}
//....
public OrderModel()
{
_detailed = false;
}
}
public class OrderDetailedModel :OrderModel
{
//.....
public OrderDetailedModel()
{
_detailed = true;
}
}
它不漂亮,但很管用。你能发布订单代码和订单详细信息吗?@IronMan84当然可以。虽然我担心它们没有什么有趣的地方。请参阅编辑。您可以发布订单和订单详细信息的代码吗?@IronMan84当然可以。虽然我担心它们没有什么有趣的地方。请参见编辑。
public class OrderModel
{
protected bool _detailed;
[Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(PropertyName = "order_id")]
public int Id { get; set; }
[Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public bool Detailed
{
get { return _detailed; }
set
{
if( (this.GetType() == typeof(OrderModel) && value== true) ||
(this.GetType() == typeof(OrderDetailedModel) && value==false))
throw new ArgumentException("This property is restricted");
_detailed = value;
}
}
//....
public OrderModel()
{
_detailed = false;
}
}
public class OrderDetailedModel :OrderModel
{
//.....
public OrderDetailedModel()
{
_detailed = true;
}
}