假设我有一个名为Department的实体,我是从MyDataContext检索的.部门有一个名为Employees的协会.
我想在一个部门添加一堆新员工.而不是使用LINQ,这将导致多个查询,我做一个批量插入:
MyDataContext.ExcecuteCommand(
"Insert INTO Employee (DeptID, etc…), (DeptID, etc…), (DeptID, etc…)"
);
Run Code Online (Sandbox Code Playgroud)
现在我的Department对象对这些更改一无所知,特别是Employees属性,因为Department.Employees.Count()返回0
我已经尝试了以下两种方法来刷新以更新部门及其相关的员工:
MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, Department);
MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, Department.Employees);
Run Code Online (Sandbox Code Playgroud)
但仍然是Department.Employees.Count()返回0
我知道数据实际上已正确添加,因为如果我创建一个新的DataContext并获取Department实体,则Department.Employees.Count()= 3
如何在不使用新的DataContext的情况下更新MyDataContext或现有的Department实体?
(我在整个请求中使用一个DataContext,并使用它执行几个不同的数据操作,因此很难尝试引入另一个DataContext)
我有一个使用在Azure中运行的LINQ-TO-SQL的相当大的Web应用程序,我遇到来自SQL-Azure的Transient错误,因此需要实现重试.我知道Transient Fault Handling Framework和一些提供示例如何使用它的站点,但看起来你必须将每个LINQ查询包装成类似于下面的内容:
RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5));
Result = retry.ExecuteAction(() =>
{
… LINQ query here...
});
Run Code Online (Sandbox Code Playgroud)
在我的数据层中有数百个LINQ查询,这看起来非常混乱,而且很多时候查询在枚举结果之前并没有实际执行.例如,我的数据层中的大多数函数都将IQueryable <>返回到业务层,这使得它们比返回List更灵活.因此,这意味着您必须使用数据库重试逻辑来丢弃业务逻辑层 - 这很丑陋.
所以我想为了保持数据层中的重试逻辑,我必须在我的所有查询上放置.ToList(),以便它们在那里执行,而不是在上面的层中.
我真的希望有一种方法可以在某些基类中实现重试逻辑,而不必更改我的所有查询.好像EF也会遇到这个问题.
尝试和SQL-Azure团队进行自动重试是真正的答案,所以我们不必在代码中担心这一点吗?
我正在实现此处所述的组合Web /辅助角色方案,您只需将以下内容添加到您的辅助角色:
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("WorkerRole1 entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
Run Code Online (Sandbox Code Playgroud)
正如帖子的评论中所指出的那样,问题在于此工作进程无法读取web.config,因此您必须添加app.config.还注意到app.config不会自动部署.
所以我的问题是如何配置我的项目,以便部署app.config?
我已将app.config添加到我的项目中,将Build Action设置为"Content",然后"始终复制"
这项工作在EMULATOR中很精细,但在部署到Azure时却没有.
注意:我注意到在模拟器中创建了一个projectname.dll.config,但是在部署到Azure时却没有.我正在使用VS2010,Windows Azure Tools 2011
我知道有人会建议使用.cscfg文件,但我的许多组件都从web.config/app.config获取设置:Elmah,Transient Fault Handling Client,Diagnostics,Email等...
我有一个运行在azure中的MVC Web应用程序,可以提供存储在云存储中的大型文件,如mp3,pdf等.提供这些文件的最佳方式是什么,因此用户可以在点击链接/按钮时下载它们?
简单的方法就是向他们展示:
<a href="...blob.core.windows.net/container/file.mp3">
但是用户必须右键单击才能下载.
要强制下载,您可以返回File ActionResult:
public ActionResult GetPDF( string filename )
{
return File( filename, "application/pdf", Server.HtmlEncode( filename ) );
}
Run Code Online (Sandbox Code Playgroud)
这个(我认为)的缺点是webrole必须读入文件并将它们输出到流,这将消耗资源,并可能使许多用户陷入困境.而简单的href链接解决方案基本上放弃了工作,因此浏览器直接与云存储对话.
我对么?我应该关注webrole上的额外工作吗?
是否有另一种强制文件下载的方法而不会给webrole带来负担?
更新:
所以我最终做的是使用Content-Type"binary/octet-stream"上传mp3 - 这似乎强制下载提示.不确定这是不是一个好习惯,但它到目前为止是有效的.
假设我有一个 Position 表和一个相关的 Team 表,我需要从 ExecuteQuery() 调用中获取 Position 实体的列表,以及相关表中的 Team 名称。如:
var list = dc.ExecuteQuery<T>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
Run Code Online (Sandbox Code Playgroud)
(我需要使用 ExecuteQuery(),因为实际查询非常复杂。)
是的,我可以使用 Position 类中的所有字段和 teamname 字段创建一个新的平面类,但我需要结果集是实际的 LINQ 实体,而不仅仅是 POCO,因为我将遍历这些记录并更新一些字段.
第一个想法,创建一个包含位置和新字段的新类
public class PositionExtended
{
public Position position {get; set;}
public string teamname {get; set;}
}
ExecuteQuery<PositionExtended>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
Run Code Online (Sandbox Code Playgroud)
这正确映射了团队名称,但不是位置对象。
第二个想法,继承自 Position 类:
public class PositionExtended : …Run Code Online (Sandbox Code Playgroud) 我正在尝试基于这篇文章创建一个通用的LINQ-TO-SQL存储库,它基本上允许您定义通用基础存储库类,然后您可以通过从通用基础派生来定义所有实际存储库类.
我希望选择使用存储库,无论是否传入数据上下文,因此我决定在通用基类中创建两个构造函数:
public abstract class GenericRepository<T, C>
where T : class
where C : System.Data.Linq.DataContext, new()
{
public C _db;
public GenericRepository()
{
_db = new C();
}
public GenericRepository(C db)
{
_db = db;
}
public IQueryable<T> FindAll()
... and other repository functions
}
Run Code Online (Sandbox Code Playgroud)
要使用它,我会浏览我的实际存储库类:
public class TeamRepository : GenericRepository<Team, AppDataContext> { }
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试将其与参数一起使用:
AppDataContext db = new AppDataContext();
TeamRepository repos=new TeamRepository(db);
Run Code Online (Sandbox Code Playgroud)
我收到错误: 'App.Models.TeamRepository'不包含带有1个参数的构造函数
所以,看起来你不能继承C#中的构造函数,那么,你将如何对此进行编码以便我可以调用:TeamRepository()或TeamRepository(db)
我的SQL表名都是复数 - 事件,团队,校园等...当我将表拖入dbml时,它会创建一个名为" Campuse " 的实体,当然这是不正确的.我在属性页面中手动将其重命名为Campus,但它似乎没有正确更新所有自动生成的代码.例如,.designer.cs文件具有以下代码:
public System.Data.Linq.Table<Campus> Campus
Run Code Online (Sandbox Code Playgroud)
什么时候应该
public System.Data.Linq.Table<Campus> Campuses
Run Code Online (Sandbox Code Playgroud)
关联名称的类似问题.
我可能会完成所有生成的代码,并尝试手动重命名所有内容,但这很痛苦.有没有更好的办法?
var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
// create container
Storage = account.CreateCloudBlobClient();
Container = Storage.GetContainerReference("container");
Container.CreateIfNotExist();
// configure for public access
var permissions = Container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
Container.SetPermissions(permissions);
...
CloudBlockBlob blob = Storage.GetBlockBlobReference(blobname);
blob.UploadFromStream(file.InputStream);
url = blob.Uri.AbsoluteUri;
//url returns: https://myazureacct.blob.core.windows.net/...
Run Code Online (Sandbox Code Playgroud)
我可以使用http:// myazureacct访问该资源....但为什么AbsoluteUri会返回https?
linq-to-sql ×5
azure ×3
c# ×2
app-config ×1
asp.net-mvc ×1
blob ×1
download ×1
executequery ×1
generics ×1
pluralize ×1
repository ×1
url ×1