我正在使用EF4.1代码优先和TPT(每类型表)继承.我有这样的结构
public class Customer
{
public virtual ICollection<Product> Products {get; set;}
}
public class Product
{
[Required]
public int Id { get; set; }
[Required]
public virtual Customer {get; set;}
public decimal Price { get; set; }
}
public class SpecializedProduct : Product
{
public string SpecialAttribute { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我删除客户时,我希望删除与该客户关联的所有产品.我可以在Customer和Product之间指定一个WillCascadeOnDelete(true):
modelBuilder.Entity<Customer>().HasMany(e => e.Products).WithRequired(p => p.Customer).WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)
但是,由于在我尝试删除客户时,SpecializedProduct和Product之间存在异常关键关系,因此会出现异常:
DELETE语句与REFERENCE约束"SpecializedProduct _TypeConstraint_From_Product_To_SpecializedProduct"冲突.冲突发生在数据库"Test",表"dbo.SpecializedProduct",列"Id"中.该语句已终止.
如果我在SpecializedProduct _TypeConstraint_From_Product_To_SpecializedProduct约束上手动设置一个删除级联,它可以工作,但我希望能够使用模型构建器或代码中的其他方式指定它.这可能吗?
提前致谢!
最好的祝福
西蒙
我想我可能在Uri.IsWellFormedUriString方法中发现了一个错误,可能是因为它只符合RFC 2396和RFC 2732标准,而不是新的RFC 3986,这使得前面提到的两个过时了.
我认为发生的是任何非us-ascii字符都会使它失败,所以带有æ,ø,ö或å等字符的url会使它返回false.由于现在允许这些类型的字符(维基百科和其他人使用它们),我认为Uri.IsWellFormedUriString应该接受它们.下面的正则表达式取自RFC 3986.
你怎么看?Uri课程应该更新吗?
无论如何这里是一些显示错误的示例代码:
static void Main(string[] args)
{
var urls = new []
{
@"/aaa/bbb/cccd",
@"/aaa/bbb/cccæ",
@"/aaa/bbb/cccø",
@"/aaa/bbb/cccå"
};
var regex = new Regex(@"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?");
Debug.WriteLine("");
foreach (var url in urls)
{
if (Uri.IsWellFormedUriString(url, UriKind.Relative))
Debug.WriteLine(url + " is a wellformed Uri");
if (regex.IsMatch(url))
Debug.WriteLine(url + " passed the Regex");
Debug.WriteLine("");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
/aaa/bbb/cccd is a wellformed Uri
/aaa/bbb/cccd passed the Regex
/aaa/bbb/cccæ passed the Regex
/aaa/bbb/cccø …Run Code Online (Sandbox Code Playgroud)