我正在尝试找出创建 SQL Server 主键、外键和约束的最佳方法,以在 LINQ/实体数据对象中准确表示我的数据模型。让我们假设 - 为简化起见 - 我有四个主要表 - Cats、Dogs、Pets 和 Owners - 以及一个关联表:OwnersToPets:
create table Cats (
ID_Cats int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(50) NOT NULL,
miceEaten int NULL
)
create table Dogs (
ID_Dogs int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(50) NOT NULL,
favouriteToy nvarchar(50) NULL
)
create table Owners (
ID_Owners int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(50) NOT NULL,
)
create table Pets (
ID_Pets int NOT NULL IDENTITY PRIMARY KEY, …Run Code Online (Sandbox Code Playgroud) 我将此person表作为超级父级(或超类型),
id
firstname
lastname
email
telephone
...
...
Run Code Online (Sandbox Code Playgroud)
和user表作为孩子(或子类型)
id
person_id (FK)
password
username
screenname
...
...
Run Code Online (Sandbox Code Playgroud)
它们必须是一对一 ( 1:1 ) 的关系,因为用户不能重复两次,因此给定人员行中的特定电子邮件值不能重复两次。
然后我有这张message表,它存储来自任何人的消息,
id
firstname
lastname
email
telephone
subject
content
...
...
Run Code Online (Sandbox Code Playgroud)
但可以看到的是firstname,lastname,email,telephone被复制的message表。
所以,我想把它参考person下面的表格,
id
person_id
subject
content
...
Run Code Online (Sandbox Code Playgroud)
但随后似乎并不正确,因为一个人具有相同的电子邮件,名称等可以发送邮件给我很多次他们想要的,所以细节他/提供可重复她。
那么,我应该message …
我正在做一个学校项目,我有一个 SQL Server,我的团队有一个数据库。
我已经导入了使用实体框架创建的本地数据库。
现在模型已经改变,表属性被添加/删除,我想更新我的完整数据库。
然而,老师没有给我们创建权限,所以删除整个数据库并不是一个真正的选择。
现在是我的问题,是否可以删除当前数据库中的所有表并导入新创建的表而没有问题?还是我真的需要删除整个数据库?
根据以下堆栈跟踪,我收到间歇性错误。我将 C# 实体框架与在单独的服务器计算机上运行的 SQL Server 2012 企业版一起使用。我可以从开发机器使用 SSMS 连接和查询数据库。
重新启动服务器计算机是问题的短期解决方案。然后连接再次工作,至少一段时间(数小时或数天)。
如何在不需要重新启动服务器计算机的情况下长期诊断或修复此问题?
Exception.ToString():
System.Data.Entity.Core.EntityException:
The underlying provider failed on Open. --->
System.Data.SqlClient.SqlException:
A network-related or instance-specific error occurred while establishing a connection to SQL Server.
The server was not found or was not accessible.
Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
(provider: Named Pipes Provider, error: 40 -
Could not open a connection to SQL Server) --->
System.ComponentModel.Win32Exception: The network path …Run Code Online (Sandbox Code Playgroud) 我有一个 ASP.NET MVC Web 应用程序部署到 Windows Server 2012 机器上的 IIS。当应用程序第一次启动时,它会在必要时通过实体框架创建它需要的数据库和表。这一切正常,现在我想通过 SQL Server Management Studio 对数据库进行一些管理。但是,当我打开该工具时,我只能看到系统数据库。如果我从连接字符串中删除“User Instance=true”并让应用程序再次创建数据库,我就可以看到数据库。
当User Instance=true 在连接字符串中时,为什么我无法查看Web 应用程序创建的数据库? 如果我使用具有所有角色的帐户通过 Management Studio 查看服务器实例,我希望它能够查看任何和所有数据库。
一些可能有帮助的细节:
该应用程序在 Web.config 中使用以下连接字符串:
<add name="DefaultConnection" connectionString="Data Source=.\SqlExpress;
Initial Catalog=Foo.Dashboard; Integrated Security=SSPI;User Instance=true"
providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
在IIS中,应用程序池设置为与身份运行LocalService和Load User Profile设置True。在 SQL Server Express 上,我们为该Local Service帐户添加了一个登录名并为其分配了dbcreator角色。当应用程序启动时,它就能够创建数据库和表,一切似乎都在运行。
然后我使用远程桌面连接到服务器并打开 SQL Server Management Studio。要连接到数据库,我输入.\SQLEXPRESS服务器名称并使用Windows Authentication. 然后我连接并且只看到系统数据库。我已将所有可能的数据库角色添加到我的登录名中,并且我看到我VIEW ANY DATABASE在有效选项卡中拥有权限。
这是我的表:
CREATE TABLE [dbo].[Trackers] (
[IdTracker] INT IDENTITY (1, 1) NOT NULL,
[IMEI] NVARCHAR (16) NULL,
[CreationDate] DATETIME NULL,
[SuppressionDate] DATETIME NULL,
[LastUpdateDate] DATETIME NULL,
[BuyDate] DATETIME NOT NULL,
[Status] INT NOT NULL,
[LastTrackerUpdateDate] DATETIME NULL,
[IdLastTrackerPosition] INT NULL,
PRIMARY KEY CLUSTERED ([IdTracker] ASC)
);
CREATE TABLE [dbo].[TrackerPositions] (
[IdTrackerPosition] INT IDENTITY (1, 1) NOT NULL,
[TrackerId] INT NOT NULL,
[Position] [sys].[geography] NULL,
[Date] DATETIME NOT NULL,
[Speed] REAL NULL,
[NbSatellites] TINYINT NULL,
[Direction] REAL NULL,
[HDOP] REAL NULL,
PRIMARY …Run Code Online (Sandbox Code Playgroud) 我正在使用 C#,实体框架。用于开发 SQL Server。我有一个方法,它有两个参数 ( int ID, List<String> _listobj)。对于每个 ID,都有一个 obj 列表。所有这些 ID 和列表都将插入到数据库中的不同表中。所以问题是:最好的做法是什么?我有几个选择:
在 C# 中,拆分list<obj>为单个值,然后创建一个带有两个参数 ( ID, str)的存储过程,然后 C# 将根据列表的大小多次调用存储过程
将ID和list<obj>作为两个参数传递给存储过程,并让存储过程拆分list<obj>. 这样C#只会调用一次存储过程
第二种策略可行吗?如果是,哪个在性能方面更好?
sql-server-2008 sql-server stored-procedures entity-framework c#
我每 1 秒执行一次查询,大部分时间它不返回任何结果(由实体框架生成的 SQL):
SELECT TOP (5)
[Extent1].[ID] AS [ID],
***30 more columns***
FROM ParentTable AS [Extent1]
WHERE ([Extent1].[ImageTaken] = 1) AND ([Extent1].[ImageProjected] <> 1) AND ( EXISTS (SELECT
1 AS [C1]
FROM ChildTable AS [Extent2]
WHERE [Extent1].[ID] = [Extent2].[Parent_ID]
))
Run Code Online (Sandbox Code Playgroud)
上面的查询大约需要 400 毫秒。但是,如果我从结果中排除除 ID 之外的所有列,则大约需要 100 毫秒。
如果没有结果,为什么执行时间如此不同?我查看了执行计划,它们看起来完全相同(在今天之前我从未看过执行计划,因此请谨慎对待)。
我想包括所有列,但显然我只在有结果时才需要它们。
实际执行计划
编辑 更多细节:
父表定义
USE [DB]
GO
/****** Object: Table [dbo].[Inspection_CapturedImageQueueItem] Script …Run Code Online (Sandbox Code Playgroud) performance sql-server entity-framework sql-server-2017 query-performance
我正在 AWS 实例上运行 SQL Server Express 12.0.4100,该实例具有 16 个内核和 64 GB RAM,附加了 3TB 和 9000 IOPS EBS。这已经完美运行了 2 年,直到本周都没有问题。
服务器正在运行一个 web 应用程序,每秒接收 5-10 个请求,每个请求都被转换为对数据库的相同查询,只是参数不同(这都由 ORM 处理)。这些查询(我们称之为GetProduct查询)有点大,因为它们从 13 个表中检索数据以构建发送回给用户的单个 JSON 响应。查询通常需要 800 到 1500 毫秒的时间才能运行。
本周我注意到,当我执行一个查询时,一个简单的选择前 1000 个表中的单个 where 条件也被GetProduct查询扫描,SQL Management Studio 报告的数据库 I/O 使用率上升,在 30MB/s 之间波动和 50MB/s,即使我的查询已经返回(正常的数据库 I/O 在 0.1MB/s 和 1MB/s 之间)。我突然发现我的GetProduct查询现在需要 60 多秒才能完成!导致超时和对数据库执行的所有查询变得非常缓慢。如果我重新启动整个服务器框,这是固定的,一切都会恢复正常,直到我再次运行一个非常奇怪的查询。
我远非数据库专家,我是一名程序员,也负责维护这个数据库,团队中没有一个人对数据库了解很多。我更新了统计数据并注意到我的大多数索引的碎片化程度非常高(SSMS 报告的 95% 到 99% 之间)。我正在计划一个维护窗口,以便我可以删除应用程序并重建所有索引。
碎片会导致这种行为吗?我执行了sp_whoisactive,我确定我的数据库上没有其他任何东西在运行,只是调用GetProduct查询需要很多时间才能完成。
更新
我使用 SSMS 活动监视器中的“最近昂贵的查询”部分获得了查询计划,因为此查询sp_whoisactive @get_plans = 1 …
performance sql-server entity-framework fragmentation sql-server-2012
当您在 CREATE TABLE 脚本中创建主键和外键约束时,会创建命名约束,例如 FK__RecentlyVi__ScId__2764765D ...这些约束是否可预测?IE:如果你在另一台服务器上运行相同的创建脚本,约束名称是否相同?
我问是因为使用实体框架,当您对辅助表有多个引用时,您会获得诸如... Foreign、Foreign1、Foreign2 等属性...有时在重新生成实体模型时,顺序会有所不同...我想出了以下方法来解决这个问题,但想知道“默认”约束名称是否有效,即使我现在使用的是命名约束。
我的解决方法包括在下面。如果我将来再次需要这个,可以重构基于外键和对象类型名称获取实体的属性。
private Contact GetContactMatchForForeignKey(string foreignKeyName)
{
var props = typeof(Order).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(EdmRelationshipNavigationPropertyAttribute)));
foreach (var prop in props) {
var attrs = prop.GetCustomAttributes(typeof(EdmRelationshipNavigationPropertyAttribute), true);
foreach (var attr in attrs) {
var a = (EdmRelationshipNavigationPropertyAttribute)attr;
if (a.RelationshipName == foreignKeyName && a.TargetRoleName == "Contact") {
return (Contact)prop.GetValue(this, null);
}
}
}
return null;
}
private void SetContactMatchForForeignKey(string foreignKeyName, Contact value)
{
var props = typeof(Contact).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(EdmRelationshipNavigationPropertyAttribute)));
foreach (var prop in props) …Run Code Online (Sandbox Code Playgroud) foreign-key database-design sql-server constraint entity-framework
entity-framework ×10
sql-server ×9
performance ×2
c# ×1
constraint ×1
foreign-key ×1
index ×1
locking ×1
mysql ×1
mysql-5.5 ×1
ssms ×1
subtypes ×1
t-sql ×1