Từ những gì tôi có thể thấy trong mẫu T4 mặc định, thuộc tính khóa ngoài của thực thể không được liên kết trực tiếp với tham chiếu thực thể được liên kết với khóa.
Có một cặp vợ chồng tiếp cận vấn đề của bạn về việc di chuyển từ LINQ to SQL sang EF4. Một trong số họ sẽ đăng ký sự kiện AssociationChanged
của các hiệp hội của bạn để nó tự động cập nhật trường của bạn. Trong bối cảnh của bạn, một cách tiếp cận có thể là một cái gì đó như thế này:
// Extends Employee entity
public partial class Employee
{
private void CompanyChanged(Object sender, CollectionChangeEventArgs e)
{
// Apply reactive changes; aka set CompanyID
// here
}
// Create a default constructor that registers your event handler
public Employee()
{
this.CompanyReference.AssociationChanged += CompanyChanged;
}
}
Cá nhân, nếu bạn muốn giới hạn việc duy trì cần thiết để duy trì loại này logic, tôi muốn đề nghị thay đổi mẫu T4 của bạn (hoặc thay đổi nó cho mình hoặc tìm một) để nó đặt CompanyId
khi Company
được thay đổi như được hiển thị trước đó.
Gil Fink đã viết một bản giới thiệu khá tốt cho các mẫu T4 với EF4 và bạn có thể tra cứu Scott Hanselman bao gồm một loạt các liên kết hữu ích và tài nguyên để làm việc với mẫu T4. Trên một lưu ý cuối cùng, trừ khi tôi bị nhầm lẫn, truy cập trực tiếp các khóa nước ngoài như là sự trợ giúp của một thực thể là cái gì đó mới từ EF3.5 đến 4. Trong 3.5, cách duy nhất bạn có thể truy cập nó là thông qua thực thể liên quan (Employee.Company.CompanyID
).). Tôi tin rằng tính năng này đã được thêm vào trong EF4 để bạn không phải tải các liên kết (sử dụng "include") để lấy khóa ngoài khi chọn từ kho dữ liệu.
Có lẽ EF thực hiện điều này sẽ là, nếu bạn có liên kết, hãy trải qua liên kết để nhận ID, trước tiên và quan trọng nhất. Nhưng đó chỉ là suy đoán khi tôi không có dấu ngoặc kép để sao lưu nó.
[EDIT 2010/06/16]: Sau một readthrough và phân tích các yếu tố edmx xml nhanh chóng, tôi tìm thấy một gọi ReferentialConstraint mà dường như có chứa các lĩnh vực then chốt nước ngoài tham gia FK_Relation specfic.
Heres đoạn mã để sửa đổi bên trong mẫu mặc định T4 edmx, phần Viết Thuộc tính điều hướng. (Template_RegionNavigationProperties
), xung quanh dòng 388 của mẫu chưa được sửa đổi.Hãy cố gắng bỏ qua định dạng khủng khiếp ...
<#=code.SpaceAfter(NewModifier(navProperty))#><#=Accessibility.ForProperty(navProperty)#> <#=MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code)#> <#=code.Escape(navProperty)#>
{
<#=code.SpaceAfter(Accessibility.ForGetter(navProperty))#>get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<<#=MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code)#>>("<#=navProperty.RelationshipType.FullName#>", "<#=navProperty.ToEndMember.Name#>").Value;
}
<#=code.SpaceAfter(Accessibility.ForSetter(navProperty))#>set
{
// edit begins here
if(value != null)
{
// Automatically sets the foreign key attributes according to linked entity
<#
AssociationType association = GetSourceSchemaTypes<AssociationType>().FirstOrDefault(_ => _.FullName == navProperty.RelationshipType.FullName);
foreach(var cons in association.ReferentialConstraints)
{
foreach(var metadataProperty in cons.FromProperties)
{
#>
this.<#=metadataProperty.Name#> = value.<#=metadataProperty.Name#>;
//this._<#=metadataProperty.Name#> = value._<#=metadataProperty.Name#>; // use private field to bypass the OnChanged events, property validation and the likes..
<#
}
}
#>
}
else
{
// what usually happens in Linq-to-SQL when an association is set to null
// here
}
// edit ends here
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<<#=MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code)#>>("<#=navProperty.RelationshipType.FullName#>", "<#=navProperty.ToEndMember.Name#>").Value = value;
}
}
Tôi đã thử nghiệm kỹ lưỡng, nhưng có một số xác định và thiếu sót đó. Có lẽ nó có thể cung cấp cho bạn một mẹo hướng tới một giải pháp bất kể.
Nếu bạn đã lưu thay đổi của bạn với những gì bạn mô tả, là trường ở giá trị đúng khi bạn chọn thực thể của bạn trở lại từ kho dữ liệu? –
Vâng, tất nhiên rồi. Nhưng tôi có rất nhiều mã di sản mà vẫn phụ thuộc vào hành vi của L2S. –