Ok, tôi đã cố gắng chuyển đổi mô hình của mình để sử dụng LINQ nhưng không muốn vứt bỏ DTO hiện tại và các giao diện của chúng. lĩnh vực.Trợ giúp cần thiết cho các hoạt động LINQ to SQL (chèn/cập nhật) với các POCO
Tôi cố gắng tìm bài đăng blog mà đã vạch ra quá trình này khá độc đáo:
Achieving POCOs in LINQ To SQL
Tôi có quản lý để có được việc thu hồi các hồ sơ các đối tượng hoạt động bình thường, tuy nhiên, do tính chất lồng nhau của mô hình của tôi, tôi dường như không thể làm việc bổ sung cho các đối tượng con. Tức là, nếu tôi tạo một đối tượng con, và đặt tham chiếu đến đối tượng cha mẹ mong muốn, LINQ to SQL vẫn ném một ngoại lệ cho biết tham chiếu của đứa trẻ đối với phụ huynh là null. Nếu tôi cố gắng để thêm một đối tượng cha mẹ già đơn giản, nó thành công, nhưng thêm con đối tượng trực tiếp không
Đây là thử nghiệm thất bại của tôi:
[Test]
public void AddSelectionShouldAddSelectionToMarket()
{
Market market = (Market) new Repository().GetMarket(1);
Selection selection = new Selection();
selection.Market = market;
new Repository().AddSelection(selection);
Assert.IsTrue(selection.SID > 0);
}
Dưới đây là thông báo lỗi:
System.InvalidOperationException : Một nỗ lực đã được thực hiện để xóa mối quan hệ giữa Thị trường và Lựa chọn. Tuy nhiên, không thể đặt một trong các khóa ngoại của mối quan hệ (Selection.MID) thành null.
Các bộ phận có liên quan của 2 đối tượng:
[DataContract]
public class Selection : ISelection
{
private int mID;
[DataMember]
public int MID
{
get { return this.mID; }
set { this.mID = value; }
}
private Market market;
[DataMember]
public Market Market
{
get { return this.market; }
set
{
this.market = value;
this.mID = value.MID;
}
}
}
[DataContract]
public class Market : IMarket
{
private int mID;
[DataMember]
public int MID
{
get { return this.mID; }
protected set { this.mID = value; }
}
private List<Selection> selections;
[DataMember]
public List<Selection> Selections
{
get { return this.selections; }
set
{
this.selections = value;
// For LINQ
foreach (Selection selection in selections)
{
selection.MID = mID;
selection.Market = this;
}
}
}
}
đang DA của tôi:
MarketsDataContext context = new MarketsDataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Selection>(s => s.Prices);
options.LoadWith<Market>(m => m.Selections);
context.LoadOptions = options;
return context;
và;
public void AddSelection(ISelection selection)
{
using (MarketsDataContext context = MarketsDataContext.GetContext())
{
context.Selections.InsertOnSubmit((Selection) selection);
context.SubmitChanges();
}
}
Và cuối cùng bản đồ XML của tôi:
<Table Name="dbo.Markets" Member="Markets">
<Type Name="Market">
<Column Name="MID" Member="MID" Storage="mID" DbType="Int NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" AutoSync="OnInsert" />
<Association Name="FK_Market-Selections" Member="Selections" Storage="selections" ThisKey="MID" OtherKey="MID" DeleteRule="NO ACTION" />
</Type>
</Table>
<Table Name="dbo.Selections" Member="Selections">
<Type Name="Selection">
<Column Name="SID" Member="SID" Storage="sID" DbType="Int NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" AutoSync="OnInsert" />
<Column Name="MID" Member="MID" Storage="mID" DbType="Int NOT NULL" />
<Association Name="FK_Market-Selections" Member="Market" Storage="market" ThisKey="MID" OtherKey="MID" IsForeignKey="true" />
</Type>
</Table>
Vì vậy, có thể bất cứ ai chỉ cho tôi đi đúng hướng? Tôi đã tìm kiếm nhiều giờ ...
Edit:
Dưới đây là stacktrace tôi cho thử nghiệm thất bại của tôi:
at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.SynchDependentData()
at System.Data.Linq.ChangeProcessor.ValidateAll(IEnumerable`1 list)
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at BetMax.DataModel.Repository.AddSelection(ISelection selection) in Repository.cs: line 68
at BetMax.DataModel.Test.ModelTest.AddSelectionShouldAddSelectionToMarket() in ModelTest.cs: line 65
Và phương pháp GetMarket tôi:
public IMarket GetMarket(int MID)
{
Market market;
using (MarketsDataContext context = MarketsDataContext.GetContext())
{
market = context.Markets.Single(m => m.MID == MID);
}
return market;
}
Chỉnh sửa 2:
Vâng, thêm
DeleteOnNull="true"
để chọn khóa ngoài trong ánh xạ XML đã loại bỏ lỗi khóa ngoài, nhưng bây giờ tôi nhận được tham chiếu null trên một trong các đối tượng con của Selections, nói tham chiếu đến lựa chọn là null mặc dù lựa chọn đang được khởi tạo không có biến nào được đặt (ngoài khóa ngoại). Tôi thậm chí đã cố gắng tạo ra một đối tượng trẻ em, và thiết lập tài liệu tham khảo của nó một cách chính xác nhưng tôi vẫn nhận được lỗi này:
System.NullReferenceException: Object reference not set to an instance of an object.
at BetMax.DTO.Price.set_Selection(Selection value) in Price.cs: line 25
at System.Data.Linq.Mapping.PropertyAccessor.Accessor`3.SetValue(ref T instance, V value)
at System.Data.Linq.Mapping.MetaAccessor`2.SetBoxedValue(ref Object instance, Object value)
at System.Data.Linq.ChangeProcessor.ClearForeignKeysHelper(MetaAssociation assoc, Object trackedInstance)
at System.Data.Linq.ChangeProcessor.ClearForeignKeyReferences(TrackedObject to)
at System.Data.Linq.ChangeProcessor.PostProcessUpdates(List`1 insertedItems, List`1 deletedItems)
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at BetMax.DataModel.Repository.AddSelection(ISelection selection) in Repository.cs: line 68
at BetMax.DataModel.Test.ModelTest.AddSelectionShouldAddSelectionToMarket() in ModelTest.cs: line 69
Giá là một đối tượng, xây dựng trong cùng mà lựa chọn có liên quan đến thị trường (1 lựa chọn có nhiều mức giá, 1 thị trường có nhiều lựa chọn) v.v.
Ahh rất tốt điểm. Tôi sẽ thực sự xử lý bối cảnh mỗi khi tôi làm một hoạt động, vì vậy tôi sẽ xem nếu kiên trì nó lâu hơn một chút sẽ giúp ... – mwjackson
Vâng có vẻ như điều này đã không giải quyết được vấn đề. – mwjackson